From 63498b0f96a86f62cdca2d2bc1efd5bb97fb32a7 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 23 Feb 2023 13:14:54 +0100 Subject: [PATCH 01/21] OnPageError V4 Signed-off-by: Hugo Olthof --- .../webview_flutter/example/lib/main.dart | 3 ++ .../example/lib/simple_example.dart | 1 + .../example/test/main_test.dart | 3 ++ .../lib/src/navigation_delegate.dart | 10 ++++ .../webview_flutter/pubspec.yaml | 9 ++-- .../test/navigation_delegate_test.dart | 12 +++++ .../test/navigation_delegate_test.mocks.dart | 10 ++++ .../test/webview_controller_test.mocks.dart | 10 ++++ .../gradle/wrapper/gradle-wrapper.properties | 5 ++ .../WebViewClientFlutterApiImpl.java | 10 ++++ .../WebViewClientHostApiImpl.java | 13 +++++ .../example/lib/main.dart | 3 ++ .../lib/src/android_proxy.dart | 1 + .../lib/src/android_webview.dart | 9 ++++ .../lib/src/android_webview_api_impls.dart | 19 +++++++ .../lib/src/android_webview_controller.dart | 13 +++++ .../pigeons/android_webview.dart | 2 + .../webview_flutter_android/pubspec.yaml | 3 +- .../android_navigation_delegate_test.dart | 17 ++++++ .../test/android_webview_controller_test.dart | 2 + ...android_webview_controller_test.mocks.dart | 10 ++++ .../test/android_webview_test.dart | 17 ++++++ .../lib/src/platform_navigation_delegate.dart | 3 ++ .../example/lib/main.dart | 3 ++ .../ios/Classes/FWFDataConverters.h | 28 ++++++++++ .../ios/Classes/FWFDataConverters.m | 25 +++++++++ .../Classes/FWFNavigationDelegateHostApi.m | 33 ++++++++++++ .../lib/src/foundation/foundation.dart | 14 +++++ .../lib/src/web_kit/web_kit.dart | 44 ++++++++++++++++ .../lib/src/web_kit/web_kit_api_impls.dart | 52 +++++++++++++++++++ .../lib/src/webkit_proxy.dart | 8 ++- .../lib/src/webkit_webview_controller.dart | 13 +++++ .../pigeons/web_kit.dart | 39 ++++++++++++++ .../webview_flutter_wkwebview/pubspec.yaml | 3 +- .../test/src/web_kit/web_kit_test.dart | 31 +++++++++++ .../test/webkit_navigation_delegate_test.dart | 26 ++++++++++ .../test/webkit_webview_controller_test.dart | 1 + 37 files changed, 499 insertions(+), 6 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index ec1ce4eef16..fc726a1f87b 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart @@ -119,6 +119,9 @@ class _WebViewExampleState extends State { onPageFinished: (String url) { debugPrint('Page finished loading: $url'); }, + onPageError: (int statusCode) { + debugPrint('Error occured on page: $statusCode'); + }, onWebResourceError: (WebResourceError error) { debugPrint(''' Page resource error: diff --git a/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart b/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart index dfee9e6bd23..3315714df64 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart @@ -34,6 +34,7 @@ class _WebViewExampleState extends State { }, onPageStarted: (String url) {}, onPageFinished: (String url) {}, + onPageError: (int statusCode) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://www.youtube.com/')) { diff --git a/packages/webview_flutter/webview_flutter/example/test/main_test.dart b/packages/webview_flutter/webview_flutter/example/test/main_test.dart index 7857022c14a..67ecc15c785 100644 --- a/packages/webview_flutter/webview_flutter/example/test/main_test.dart +++ b/packages/webview_flutter/webview_flutter/example/test/main_test.dart @@ -106,6 +106,9 @@ class FakeNavigationDelegate extends PlatformNavigationDelegate { @override Future setOnPageStarted(PageEventCallback onPageStarted) async {} + @override + Future setOnPageError(PageErrorCallback onPageStarted) async {} + @override Future setOnProgress(ProgressCallback onProgress) async {} diff --git a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart index 3237fa41c0b..9b96fbcaacd 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart @@ -41,6 +41,7 @@ class NavigationDelegate { onNavigationRequest, void Function(String url)? onPageStarted, void Function(String url)? onPageFinished, + void Function(int statusCode)? onPageError, void Function(int progress)? onProgress, void Function(WebResourceError error)? onWebResourceError, }) : this.fromPlatformCreationParams( @@ -48,6 +49,7 @@ class NavigationDelegate { onNavigationRequest: onNavigationRequest, onPageStarted: onPageStarted, onPageFinished: onPageFinished, + onPageError: onPageError, onProgress: onProgress, onWebResourceError: onWebResourceError, ); @@ -87,6 +89,7 @@ class NavigationDelegate { onNavigationRequest, void Function(String url)? onPageStarted, void Function(String url)? onPageFinished, + void Function(int statusCode)? onPageError, void Function(int progress)? onProgress, void Function(WebResourceError error)? onWebResourceError, }) : this.fromPlatform( @@ -94,6 +97,7 @@ class NavigationDelegate { onNavigationRequest: onNavigationRequest, onPageStarted: onPageStarted, onPageFinished: onPageFinished, + onPageError: onPageError, onProgress: onProgress, onWebResourceError: onWebResourceError, ); @@ -104,6 +108,7 @@ class NavigationDelegate { this.onNavigationRequest, this.onPageStarted, this.onPageFinished, + this.onPageError, this.onProgress, this.onWebResourceError, }) { @@ -116,6 +121,9 @@ class NavigationDelegate { if (onPageFinished != null) { platform.setOnPageFinished(onPageFinished!); } + if (onPageError != null) { + platform.setOnPageError(onPageError!); + } if (onProgress != null) { platform.setOnProgress(onProgress!); } @@ -145,6 +153,8 @@ class NavigationDelegate { /// Invoked when a page has finished loading. final PageEventCallback? onPageFinished; + final PageErrorCallback? onPageError; + /// Invoked when a page is loading to report the progress. final ProgressCallback? onProgress; diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 8c013dec231..64535cb8f9e 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -19,9 +19,12 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_android: ^3.0.0 - webview_flutter_platform_interface: ^2.0.0 - webview_flutter_wkwebview: ^3.0.0 + webview_flutter_android: + path: ../webview_flutter_android + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface + webview_flutter_wkwebview: + path: ../webview_flutter_wkwebview dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart index 839454eaa60..bff3cedd92f 100644 --- a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart @@ -52,6 +52,18 @@ void main() { verify(delegate.platform.setOnPageFinished(onPageFinished)); }); + test('onPageError', () async { + WebViewPlatform.instance = TestWebViewPlatform(); + + void onPageError(int statusCode) {} + + final NavigationDelegate delegate = NavigationDelegate( + onPageError: onPageError, + ); + + verify(delegate.platform.setOnPageError(onPageError)); + }); + test('onProgress', () async { WebViewPlatform.instance = TestWebViewPlatform(); 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 f290d4036c2..d4b481b365e 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 @@ -208,6 +208,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i8.Future.value(), ) as _i8.Future); @override + _i8.Future setOnPageError(_i3.PageErrorCallback? onPageError) => + (super.noSuchMethod( + Invocation.method( + #setOnPageError, + [onPageError], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override _i8.Future setOnProgress(_i3.ProgressCallback? onProgress) => (super.noSuchMethod( Invocation.method( 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 27d06fdeeba..e2524784795 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 @@ -394,6 +394,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); @override + _i5.Future setOnPageError(_i6.PageErrorCallback? onPageError) => + (super.noSuchMethod( + Invocation.method( + #setOnPageError, + [onPageError], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override _i5.Future setOnProgress(_i6.ProgressCallback? onProgress) => (super.noSuchMethod( Invocation.method( diff --git a/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties b/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index aad569dc47c..93ab5e04278 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -99,6 +99,16 @@ public void onPageFinished( onPageFinished(getIdentifierForClient(webViewClient), webViewIdentifier, urlArg, callback); } + /** Passes arguments from {@link WebViewClient#onReceivedHttpError} to Dart. */ + public void onPageError( + WebViewClient webViewClient, WebView webView, int statusCodeArg, Reply callback) { + final Long webViewIdentifier = instanceManager.getIdentifierForStrongReference(webView); + if (webViewIdentifier == null) { + throw new IllegalStateException("Could not find identifier for WebView."); + } + onPageError(getIdentifierForClient(webViewClient), webViewIdentifier, statusCodeArg, callback); + } + /** * Passes arguments from {@link WebViewClient#onReceivedError(WebView, WebResourceRequest, * WebResourceError)} to Dart. diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java index 79c0210ec56..5b8650432c1 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java @@ -11,6 +11,7 @@ import android.view.KeyEvent; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.NonNull; @@ -54,6 +55,11 @@ public void onPageFinished(WebView view, String url) { flutterApi.onPageFinished(this, view, url, reply -> {}); } + @Override + public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); + } + @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { flutterApi.onReceivedRequestError(this, view, request, error, reply -> {}); @@ -117,6 +123,13 @@ public void onPageFinished(WebView view, String url) { flutterApi.onPageFinished(this, view, url, reply -> {}); } + @Override + public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); + } + } + // This method is only called when the WebViewFeature.RECEIVE_WEB_RESOURCE_ERROR feature is // enabled. The deprecated method is called when a device doesn't support this. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart index 3c6a51418f6..b3141063d78 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart @@ -107,6 +107,9 @@ class _WebViewExampleState extends State { ..setOnPageFinished((String url) { debugPrint('Page finished loading: $url'); }) + ..setOnPageError((int statusCode) { + debugPrint('Error occured on page: $statusCode'); + }) ..setOnWebResourceError((WebResourceError error) { debugPrint(''' Page resource error: diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart index a6505c21b2b..3bd570aea2c 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart @@ -41,6 +41,7 @@ class AndroidWebViewProxy { final android_webview.WebViewClient Function({ void Function(android_webview.WebView webView, String url)? onPageStarted, void Function(android_webview.WebView webView, String url)? onPageFinished, + void Function(android_webview.WebView webView, int statusCode)? onPageError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 5c552093e09..9f687656ff5 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -673,6 +673,7 @@ class WebViewClient extends JavaObject { WebViewClient({ this.onPageStarted, this.onPageFinished, + this.onPageError, this.onReceivedRequestError, @Deprecated('Only called on Android version < 23.') this.onReceivedError, this.requestLoading, @@ -692,6 +693,7 @@ class WebViewClient extends JavaObject { WebViewClient.detached({ this.onPageStarted, this.onPageFinished, + this.onPageError, this.onReceivedRequestError, @Deprecated('Only called on Android version < 23.') this.onReceivedError, this.requestLoading, @@ -802,6 +804,12 @@ class WebViewClient extends JavaObject { /// reflect the state of the DOM at this point. final void Function(WebView webView, String url)? onPageFinished; + /// Notify the host application that an HTTP error has been received from the + /// server while loading a resource. HTTP errors have status codes >= 400. + /// This callback will be called for any resource (iframe, image, etc.), not just for the main page. + /// Thus, it is recommended to perform minimum required work in this callback. + final void Function(WebView webView, int statusCode)? onPageError; + /// Report web resource loading error to the host application. /// /// These errors usually indicate inability to connect to the server. Note @@ -863,6 +871,7 @@ class WebViewClient extends JavaObject { return WebViewClient.detached( onPageStarted: onPageStarted, onPageFinished: onPageFinished, + onPageError: onPageError, onReceivedRequestError: onReceivedRequestError, onReceivedError: onReceivedError, requestLoading: requestLoading, diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 721caf7b9d0..8f83260bf5c 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -647,6 +647,25 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { } } + @override + void onPageError(int instanceId, int webViewInstanceId, int statusCode) { + final WebViewClient? instance = instanceManager + .getInstanceWithWeakReference(instanceId) as WebViewClient?; + final WebView? webViewInstance = instanceManager + .getInstanceWithWeakReference(webViewInstanceId) as WebView?; + assert( + instance != null, + 'InstanceManager does not contain an WebViewClient with instanceId: $instanceId', + ); + assert( + webViewInstance != null, + 'InstanceManager does not contain an WebView with instanceId: $webViewInstanceId', + ); + if (instance!.onPageError != null) { + instance.onPageError!(webViewInstance!, statusCode); + } + } + @override void onReceivedError( int instanceId, diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index f1fe1680f36..73d9aba9ed9 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -729,6 +729,11 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { weakThis.target!._onPageStarted!(url); } }, + onPageError: (android_webview.WebView webView, int statusCode) { + if (weakThis.target?._onPageError != null) { + weakThis.target!._onPageError!(statusCode); + } + }, onReceivedRequestError: ( android_webview.WebView webView, android_webview.WebResourceRequest request, @@ -829,6 +834,7 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { PageEventCallback? _onPageFinished; PageEventCallback? _onPageStarted; + PageErrorCallback? _onPageError; ProgressCallback? _onProgress; WebResourceErrorCallback? _onWebResourceError; NavigationRequestCallback? _onNavigationRequest; @@ -900,6 +906,13 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { _onPageFinished = onPageFinished; } + @override + Future setOnPageError( + PageErrorCallback onPageError, + ) async { + _onPageError = onPageError; + } + @override Future setOnProgress( ProgressCallback onProgress, diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart index 9978ed48bc8..4d741011a42 100644 --- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart @@ -270,6 +270,8 @@ abstract class WebViewClientFlutterApi { void onPageFinished(int instanceId, int webViewInstanceId, String url); + void onPageError(int instanceId, int webViewInstanceId, int statusCode); + void onReceivedRequestError( int instanceId, int webViewInstanceId, diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 37b38268374..e696ad62114 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -20,7 +20,8 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface dev_dependencies: build_runner: ^2.1.4 diff --git a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart index 2bf563b293d..ce3783f036c 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart @@ -55,6 +55,22 @@ void main() { expect(callbackUrl, 'https://www.google.com'); }); + test('onPageError', () { + final AndroidNavigationDelegate androidNavigationDelegate = + AndroidNavigationDelegate(_buildCreationParams()); + + late final int statusCode; + androidNavigationDelegate + .setOnPageError((int code) => statusCode = code); + + CapturingWebViewClient.lastCreatedDelegate.onPageError!( + android_webview.WebView.detached(), + 401, + ); + + expect(statusCode, 401); + }); + test('onWebResourceError from onReceivedRequestError', () { final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams()); @@ -467,6 +483,7 @@ class CapturingWebViewClient extends android_webview.WebViewClient { CapturingWebViewClient({ super.onPageFinished, super.onPageStarted, + super.onPageError, super.onReceivedError, super.onReceivedRequestError, super.requestLoading, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index 78e31449cf5..76eb0f5f9d4 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -87,6 +87,8 @@ void main() { onPageFinished, void Function(android_webview.WebView webView, String url)? onPageStarted, + void Function(android_webview.WebView webView, int statusCode)? + onPageError, @Deprecated('Only called on Android version < 23.') void Function( android_webview.WebView webView, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index 595db88c31e..0dbf524ec3a 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -323,6 +323,16 @@ class MockAndroidNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override + _i9.Future setOnPageError(_i3.PageErrorCallback? onPageError) => + (super.noSuchMethod( + Invocation.method( + #setOnPageError, + [onPageError], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override _i9.Future setOnProgress(_i3.ProgressCallback? onProgress) => (super.noSuchMethod( Invocation.method( diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index f447926cc48..6530f6f57be 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -634,6 +634,23 @@ void main() { expect(result, [mockWebView, 'https://www.google.com']); }); + test('onPageError', () { + late final List result; + when(mockWebViewClient.onPageError).thenReturn( + (WebView webView, int statusCode) { + result = [webView, statusCode]; + }, + ); + + flutterApi.onPageError( + mockWebViewClientInstanceId, + mockWebViewInstanceId, + 401, + ); + + expect(result, [mockWebView, 401]); + }); + test('onReceivedRequestError', () { late final List result; when(mockWebViewClient.onReceivedRequestError).thenReturn( 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 51e2cb2691b..0840cb67358 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 @@ -16,6 +16,9 @@ typedef NavigationRequestCallback = FutureOr Function( /// Signature for callbacks that report page events triggered by the native web view. typedef PageEventCallback = void Function(String url); +/// Signature for callbacks that report errors during loading a page. +typedef PageErrorCallback = void Function(int statusCode); + /// Signature for callbacks that report loading progress of a page. typedef ProgressCallback = void Function(int progress); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart index 64894756722..737308f520d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart @@ -108,6 +108,9 @@ class _WebViewExampleState extends State { ..setOnPageFinished((String url) { debugPrint('Page finished loading: $url'); }) + ..setOnPageError((int statusCode) { + debugPrint('Error occured on page: $statusCode'); + }) ..setOnWebResourceError((WebResourceError error) { debugPrint(''' Page resource error: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.h index d2e9bdd71ce..0fc669fcea1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.h @@ -103,6 +103,24 @@ extern FWFWKNavigationActionData *FWFWKNavigationActionDataFromNavigationAction( */ extern FWFNSUrlRequestData *FWFNSUrlRequestDataFromNSURLRequest(NSURLRequest *request); +/** + * Converts a WKNavigationResponse to an FWFWKNavigationResponseData. + * + * @param response The object containing information to create a WKNavigationResponseData. + * + * @return A FWFWKNavigationResponseData. + */ +extern FWFWKNavigationResponseData *FWFWKNavigationResponseDataFromNavigationResponse( + WKNavigationResponse *response); +/** + * Converts a NSURLResponse to an FWFNSHttpUrlResponseData. + * + * @param response The object containing information to create a WKNavigationActionData. + * + * @return A FWFNSHttpUrlResponseData. + */ +extern FWFNSHttpUrlResponseData *FWFNSHttpUrlResponseDataFromNSURLResponse(NSURLResponse *response); + /** * Converts a WKFrameInfo to an FWFWKFrameInfoData. * @@ -122,6 +140,16 @@ extern FWFWKFrameInfoData *FWFWKFrameInfoDataFromWKFrameInfo(WKFrameInfo *info); extern WKNavigationActionPolicy FWFWKNavigationActionPolicyFromEnumData( FWFWKNavigationActionPolicyEnumData *data); +/** + * Converts an FWFWKNavigationResponsePolicyEnumData to a WKNavigationResponsePolicy. + * + * @param data The data object containing information to create a WKNavigationResponsePolicy. + * + * @return A WKNavigationResponsePolicy or -1 if data could not be converted. + */ +extern WKNavigationResponsePolicy FWFWKNavigationResponsePolicyFromEnumData( + FWFWKNavigationResponsePolicyEnumData *data); + /** * Converts a NSError to an FWFNSErrorData. * diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m index 5fbbf2e21a7..87c508c4ecd 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m @@ -175,6 +175,19 @@ WKAudiovisualMediaTypes FWFWKAudiovisualMediaTypeFromEnumData( allHttpHeaderFields:request.allHTTPHeaderFields ? request.allHTTPHeaderFields : @{}]; } +FWFWKNavigationResponseData *FWFWKNavigationResponseDataFromNavigationResponse( + WKNavigationResponse *response) { + return [FWFWKNavigationResponseData + makeWithResponse:FWFNSHttpUrlResponseDataFromNSURLResponse(response.response) + forMainFrame:@(response.forMainFrame)]; +} + +FWFNSHttpUrlResponseData *FWFNSHttpUrlResponseDataFromNSURLResponse(NSURLResponse *response) { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + return [FWFNSHttpUrlResponseData + makeWithStatusCode:@(httpResponse.statusCode)]; +} + FWFWKFrameInfoData *FWFWKFrameInfoDataFromWKFrameInfo(WKFrameInfo *info) { return [FWFWKFrameInfoData makeWithIsMainFrame:@(info.isMainFrame)]; } @@ -191,6 +204,18 @@ WKNavigationActionPolicy FWFWKNavigationActionPolicyFromEnumData( return -1; } +WKNavigationResponsePolicy FWFWKNavigationResponsePolicyFromEnumData( + FWFWKNavigationResponsePolicyEnumData *data) { + switch (data.value) { + case FWFWKNavigationResponsePolicyEnumAllow: + return WKNavigationResponsePolicyAllow; + case FWFWKNavigationResponsePolicyEnumCancel: + return WKNavigationResponsePolicyCancel; + } + + return -1; +} + FWFNSErrorData *FWFNSErrorDataFromNSError(NSError *error) { return [FWFNSErrorData makeWithCode:@(error.code) domain:error.domain diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m index d9cdfd98025..3cda82628dd 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m @@ -69,6 +69,24 @@ - (void)didStartProvisionalNavigationForDelegate:(FWFNavigationDelegate *)instan completion:completion]; } +- (void)decidePolicyForNavigationResponseForDelegate:(FWFNavigationDelegate *)instance + webView:(WKWebView *)webView + navigationResponse:(WKNavigationResponse *)navigationResponse + completion: + (void (^)(FWFWKNavigationResponsePolicyEnumData *_Nullable, + NSError *_Nullable))completion { + NSNumber *webViewIdentifier = + @([self.instanceManager identifierWithStrongReferenceForInstance:webView]); + FWFWKNavigationResponseData *navigationResponseData = + FWFWKNavigationResponseDataFromNavigationResponse(navigationResponse); + [self + decidePolicyForNavigationResponseForDelegateWithIdentifier:@([self + identifierForDelegate:instance]) + webViewIdentifier:webViewIdentifier + navigationResponse:navigationResponseData + completion:completion]; +} + - (void)didFailNavigationForDelegate:(FWFNavigationDelegate *)instance webView:(WKWebView *)webView error:(NSError *)error @@ -152,6 +170,21 @@ - (void)webView:(WKWebView *)webView }]; } +- (void)webView:(WKWebView *)webView + decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse + decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { + [self.navigationDelegateAPI + decidePolicyForNavigationResponseForDelegate:self + webView:webView + navigationResponse:navigationResponse + completion:^(FWFWKNavigationResponsePolicyEnumData *policy, + NSError *error) { + NSAssert(!error, @"%@", error); + decisionHandler( + FWFWKNavigationResponsePolicyFromEnumData(policy)); + }]; +} + - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart index 4d85c392df6..ac10e94534d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart @@ -199,6 +199,20 @@ class NSUrlRequest { final Map allHttpHeaderFields; } +/// A URL load request that is independent of protocol or URL scheme. +/// +/// Wraps [NSHttpUrlResponse](https://developer.apple.com/documentation/foundation/nshttpurlresponse?language=objc). +@immutable +class NSHttpUrlResponse { + /// Constructs an [NSHttpUrlResponse]. + const NSHttpUrlResponse({ + required this.statusCode, + }); + + /// The URL being requested. + final int statusCode; +} + /// Information about an error condition. /// /// Wraps [NSError](https://developer.apple.com/documentation/foundation/nserror?language=objc). diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart index 467fa8735d6..5304960bd9a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart @@ -96,6 +96,21 @@ enum WKNavigationActionPolicy { cancel, } +/// Indicate whether to allow or cancel navigation to a webpage. +/// +/// Wraps [WKNavigationResponsePolicy](https://developer.apple.com/documentation/webkit/wknavigationresponsepolicy?language=objc). +enum WKNavigationResponsePolicy { + /// Allow navigation to continue. + /// + /// See https://developer.apple.com/documentation/webkit/wknavigationresponsepolicy/wknavigationresponsepolicyallow?language=objc. + allow, + + /// Cancel navigation. + /// + /// See https://developer.apple.com/documentation/webkit/wknavigationresponsepolicy/wknavigationresponsepolicycancel?language=objc. + cancel, +} + /// Possible error values that WebKit APIs can return. /// /// See https://developer.apple.com/documentation/webkit/wkerrorcode. @@ -162,6 +177,24 @@ class WKNavigationAction { final WKNavigationType navigationType; } +/// An object that contains information about the http error. +/// +/// Wraps [WKNavigationResponse](https://developer.apple.com/documentation/webkit/wknavigationresponse?language=objc). +@immutable +class WKNavigationResponse { + /// Constructs a [WKNavigationResponse]. + const WKNavigationResponse({ + required this.response, + required this.forMainFrame, + }); + + /// The URL request object associated with the navigation action. + final NSHttpUrlResponse response; + + /// The frame in which to display the new content. + final bool forMainFrame; +} + /// An object that contains information about a frame on a webpage. /// /// An instance of this class is a transient, data-only object; it does not @@ -776,6 +809,7 @@ class WKNavigationDelegate extends NSObject { this.didFinishNavigation, this.didStartProvisionalNavigation, this.decidePolicyForNavigationAction, + this.decidePolicyForNavigationResponse, this.didFailNavigation, this.didFailProvisionalNavigation, this.webViewWebContentProcessDidTerminate, @@ -801,6 +835,7 @@ class WKNavigationDelegate extends NSObject { this.didFinishNavigation, this.didStartProvisionalNavigation, this.decidePolicyForNavigationAction, + this.decidePolicyForNavigationResponse, this.didFailNavigation, this.didFailProvisionalNavigation, this.webViewWebContentProcessDidTerminate, @@ -834,6 +869,14 @@ class WKNavigationDelegate extends NSObject { WKNavigationAction navigationAction, )? decidePolicyForNavigationAction; + /// Called when permission is needed to navigate to new content. + /// + /// {@macro webview_flutter_wkwebview.foundation.callbacks} + final Future Function( + WKWebView webView, + WKNavigationResponse navigationResponse, + )? decidePolicyForNavigationResponse; + /// Called when an error occurred during navigation. /// /// {@macro webview_flutter_wkwebview.foundation.callbacks} @@ -856,6 +899,7 @@ class WKNavigationDelegate extends NSObject { didFinishNavigation: didFinishNavigation, didStartProvisionalNavigation: didStartProvisionalNavigation, decidePolicyForNavigationAction: decidePolicyForNavigationAction, + decidePolicyForNavigationResponse: decidePolicyForNavigationResponse, didFailNavigation: didFailNavigation, didFailProvisionalNavigation: didFailProvisionalNavigation, webViewWebContentProcessDidTerminate: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart index 7cd29da3e71..98eb06a0a47 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart @@ -73,6 +73,16 @@ extension _WKNavigationActionPolicyConverter on WKNavigationActionPolicy { } } +extension _WKNavigationResponsePolicyConverter on WKNavigationResponsePolicy { + WKNavigationResponsePolicyEnumData toWKNavigationResponsePolicyEnumData() { + return WKNavigationResponsePolicyEnumData( + value: WKNavigationResponsePolicyEnum.values.firstWhere( + (WKNavigationResponsePolicyEnum element) => element.name == name, + ), + ); + } +} + extension _NSHttpCookiePropertyKeyConverter on NSHttpCookiePropertyKey { NSHttpCookiePropertyKeyEnumData toNSHttpCookiePropertyKeyEnumData() { late final NSHttpCookiePropertyKeyEnum value; @@ -176,6 +186,15 @@ extension _NavigationActionDataConverter on WKNavigationActionData { } } +extension _NavigationResponseDataConverter on WKNavigationResponseData { + WKNavigationResponse toNavigationResponse() { + return WKNavigationResponse( + response: response.toNSUrlResponse(), + forMainFrame: forMainFrame + ); + } +} + extension _WKFrameInfoDataConverter on WKFrameInfoData { WKFrameInfo toWKFrameInfo() { return WKFrameInfo(isMainFrame: isMainFrame); @@ -193,6 +212,14 @@ extension _NSUrlRequestDataConverter on NSUrlRequestData { } } +extension _NSUrlResponseDataConverter on NSHttpUrlResponseData { + NSHttpUrlResponse toNSUrlResponse() { + return NSHttpUrlResponse( + statusCode: statusCode + ); + } +} + extension _WKNSErrorDataConverter on NSErrorData { NSError toNSError() { return NSError( @@ -844,6 +871,31 @@ class WKNavigationDelegateFlutterApiImpl ); } + @override + Future decidePolicyForNavigationResponse( + int identifier, + int webViewIdentifier, + WKNavigationResponseData navigationResponse, + ) async { + final Future Function( + WKWebView, + WKNavigationResponse navigationResponse, + )? function = _getDelegate(identifier).decidePolicyForNavigationResponse; + + if (function == null) { + return WKNavigationResponsePolicyEnumData( + value: WKNavigationResponsePolicyEnum.allow, + ); + } + + final WKNavigationResponsePolicy policy = await function( + instanceManager.getInstanceWithWeakReference(webViewIdentifier)! + as WKWebView, + navigationResponse.toNavigationResponse(), + ); + return policy.toWKNavigationResponsePolicyEnumData(); + } + @override void webViewWebContentProcessDidTerminate( int identifier, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart index e25fdf1e354..f2fe5a1ee2e 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart @@ -66,7 +66,13 @@ class WebKitProxy { Future Function( WKWebView webView, WKNavigationAction navigationAction, - )? decidePolicyForNavigationAction, + )? + decidePolicyForNavigationAction, + Future Function( + WKWebView webView, + WKNavigationResponse navigationResponse, + )? + decidePolicyForNavigationResponse, void Function(WKWebView webView, NSError error)? didFailNavigation, void Function(WKWebView webView, NSError error)? didFailProvisionalNavigation, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 76d4a172f4c..4db49711fd7 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -615,6 +615,13 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { weakThis.target!._onPageStarted!(url ?? ''); } }, + decidePolicyForNavigationResponse: (WKWebView webView, WKNavigationResponse response) async { + if (weakThis.target?._onPageError != null) { + weakThis.target!._onPageError!(response.response.statusCode); + } + + return WKNavigationResponsePolicy.allow; + }, decidePolicyForNavigationAction: ( WKWebView webView, WKNavigationAction action, @@ -688,6 +695,7 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { PageEventCallback? _onPageFinished; PageEventCallback? _onPageStarted; + PageErrorCallback? _onPageError; ProgressCallback? _onProgress; WebResourceErrorCallback? _onWebResourceError; NavigationRequestCallback? _onNavigationRequest; @@ -702,6 +710,11 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { _onPageStarted = onPageStarted; } + @override + Future setOnPageError(PageErrorCallback onPageError) async { + _onPageError = onPageError; + } + @override Future setOnProgress(ProgressCallback onProgress) async { _onProgress = onProgress; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart index 7e6c8471051..a1ee73a0d34 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart @@ -131,6 +131,20 @@ class WKNavigationActionPolicyEnumData { late WKNavigationActionPolicyEnum value; } +/// Mirror of WKNavigationResponsePolicy. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationactionpolicy?language=objc. +enum WKNavigationResponsePolicyEnum { + allow, + cancel, +} + +// TODO(bparrishMines): Enums need be wrapped in a data class because thay can't +// be used as primitive arguments. See https://github.com/flutter/flutter/issues/87307 +class WKNavigationResponsePolicyEnumData { + late WKNavigationResponsePolicyEnum value; +} + /// Mirror of NSHTTPCookiePropertyKey. /// /// See https://developer.apple.com/documentation/foundation/nshttpcookiepropertykey. @@ -203,6 +217,13 @@ class NSUrlRequestData { late Map allHttpHeaderFields; } +/// Mirror of NSURLResponse. +/// +/// See https://developer.apple.com/documentation/foundation/nshttpurlresponse?language=objc. +class NSHttpUrlResponseData { + late int statusCode; +} + /// Mirror of WKUserScript. /// /// See https://developer.apple.com/documentation/webkit/wkuserscript?language=objc. @@ -221,6 +242,14 @@ class WKNavigationActionData { late WKNavigationType navigationType; } +/// Mirror of WKNavigationResponse. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationresponse. +class WKNavigationResponseData { + late NSHttpUrlResponseData response; + late bool forMainFrame; +} + /// Mirror of WKFrameInfo. /// /// See https://developer.apple.com/documentation/webkit/wkframeinfo?language=objc. @@ -467,6 +496,16 @@ abstract class WKNavigationDelegateFlutterApi { WKNavigationActionData navigationAction, ); + @ObjCSelector( + 'decidePolicyForNavigationResponseForDelegateWithIdentifier:webViewIdentifier:navigationResponse:', + ) + @async + WKNavigationResponsePolicyEnumData decidePolicyForNavigationResponse( + int identifier, + int webViewIdentifier, + WKNavigationResponseData navigationResponse, + ); + @ObjCSelector( 'didFailNavigationForDelegateWithIdentifier:webViewIdentifier:error:', ) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 6d3286796ca..138784d97c3 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -20,7 +20,8 @@ dependencies: flutter: sdk: flutter path: ^1.8.0 - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart index dd007869f0e..35553268031 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart @@ -584,6 +584,37 @@ void main() { expect(policyData.value, WKNavigationActionPolicyEnum.cancel); }); + test('decidePolicyForNavigationResponse', () async { + WebKitFlutterApis.instance = WebKitFlutterApis( + instanceManager: instanceManager, + ); + + navigationDelegate = WKNavigationDelegate( + instanceManager: instanceManager, + decidePolicyForNavigationResponse: ( + WKWebView webView, + WKNavigationResponse navigationAction, + ) async { + return WKNavigationResponsePolicy.cancel; + }, + ); + + final WKNavigationResponsePolicyEnumData policyData = + await WebKitFlutterApis.instance.navigationDelegate + .decidePolicyForNavigationResponse( + instanceManager.getIdentifier(navigationDelegate)!, + instanceManager.getIdentifier(webView)!, + WKNavigationResponseData( + response: NSHttpUrlResponseData( + statusCode: 401 + ), + forMainFrame: true + ), + ); + + expect(policyData.value, WKNavigationResponsePolicyEnum.cancel); + }); + test('didFailNavigation', () async { final Completer> argsCompleter = Completer>(); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart index 9a654558b6c..ed56773742f 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart @@ -75,6 +75,31 @@ void main() { expect(callbackUrl, 'https://www.google.com'); }); + test('setOnPageError from decidePolicyForNavigationResponse', () { + final WebKitNavigationDelegate webKitDelgate = WebKitNavigationDelegate( + const WebKitNavigationDelegateCreationParams( + webKitProxy: WebKitProxy( + createNavigationDelegate: CapturingNavigationDelegate.new, + createUIDelegate: CapturingUIDelegate.new, + ), + ), + ); + + late final int callbackStatusCode; + webKitDelgate.setOnPageError((int statusCode) => callbackStatusCode = statusCode); + + CapturingNavigationDelegate + .lastCreatedDelegate.decidePolicyForNavigationResponse!( + WKWebView.detached(), + const WKNavigationResponse( + response: NSHttpUrlResponse(statusCode: 401), + forMainFrame: true + ), + ); + + expect(callbackStatusCode, 401); + }); + test('onWebResourceError from didFailNavigation', () { final WebKitNavigationDelegate webKitDelegate = WebKitNavigationDelegate( const WebKitNavigationDelegateCreationParams( @@ -244,6 +269,7 @@ class CapturingNavigationDelegate extends WKNavigationDelegate { CapturingNavigationDelegate({ super.didFinishNavigation, super.didStartProvisionalNavigation, + super.decidePolicyForNavigationResponse, super.didFailNavigation, super.didFailProvisionalNavigation, super.decidePolicyForNavigationAction, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index abf3f798d92..2661c1d43e9 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -994,6 +994,7 @@ class CapturingNavigationDelegate extends WKNavigationDelegate { super.didFailNavigation, super.didFailProvisionalNavigation, super.decidePolicyForNavigationAction, + super.decidePolicyForNavigationResponse, super.webViewWebContentProcessDidTerminate, }) : super.detached() { lastCreatedDelegate = this; From e1dfa71887d102499b426d49b204956fc473c805 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 23 Feb 2023 15:26:20 +0100 Subject: [PATCH 02/21] Format all changes --- .../WebViewClientFlutterApiImpl.java | 2 +- .../WebViewClientHostApiImpl.java | 6 ++++-- .../android_navigation_delegate_test.dart | 3 +-- .../ios/Classes/FWFDataConverters.m | 9 ++++----- .../Classes/FWFNavigationDelegateHostApi.m | 20 +++++++++---------- .../lib/src/web_kit/web_kit_api_impls.dart | 8 ++------ .../lib/src/webkit_proxy.dart | 2 +- .../lib/src/webkit_webview_controller.dart | 3 ++- .../test/src/web_kit/web_kit_test.dart | 7 ++----- .../test/webkit_navigation_delegate_test.dart | 13 ++++++------ 10 files changed, 33 insertions(+), 40 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index 93ab5e04278..d2e8f7be51c 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -101,7 +101,7 @@ public void onPageFinished( /** Passes arguments from {@link WebViewClient#onReceivedHttpError} to Dart. */ public void onPageError( - WebViewClient webViewClient, WebView webView, int statusCodeArg, Reply callback) { + WebViewClient webViewClient, WebView webView, int statusCodeArg, Reply callback) { final Long webViewIdentifier = instanceManager.getIdentifierForStrongReference(webView); if (webViewIdentifier == null) { throw new IllegalStateException("Could not find identifier for WebView."); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java index 5b8650432c1..78fd8c76265 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java @@ -56,7 +56,8 @@ public void onPageFinished(WebView view, String url) { } @Override - public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + public void onReceivedHttpError( + WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); } @@ -124,7 +125,8 @@ public void onPageFinished(WebView view, String url) { } @Override - public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + public void onReceivedHttpError( + WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); } diff --git a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart index ce3783f036c..8bcc03f014c 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart @@ -60,8 +60,7 @@ void main() { AndroidNavigationDelegate(_buildCreationParams()); late final int statusCode; - androidNavigationDelegate - .setOnPageError((int code) => statusCode = code); + androidNavigationDelegate.setOnPageError((int code) => statusCode = code); CapturingWebViewClient.lastCreatedDelegate.onPageError!( android_webview.WebView.detached(), diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m index 87c508c4ecd..9e55a789ad0 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m @@ -178,14 +178,13 @@ WKAudiovisualMediaTypes FWFWKAudiovisualMediaTypeFromEnumData( FWFWKNavigationResponseData *FWFWKNavigationResponseDataFromNavigationResponse( WKNavigationResponse *response) { return [FWFWKNavigationResponseData - makeWithResponse:FWFNSHttpUrlResponseDataFromNSURLResponse(response.response) - forMainFrame:@(response.forMainFrame)]; + makeWithResponse:FWFNSHttpUrlResponseDataFromNSURLResponse(response.response) + forMainFrame:@(response.forMainFrame)]; } FWFNSHttpUrlResponseData *FWFNSHttpUrlResponseDataFromNSURLResponse(NSURLResponse *response) { - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; - return [FWFNSHttpUrlResponseData - makeWithStatusCode:@(httpResponse.statusCode)]; + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + return [FWFNSHttpUrlResponseData makeWithStatusCode:@(httpResponse.statusCode)]; } FWFWKFrameInfoData *FWFWKFrameInfoDataFromWKFrameInfo(WKFrameInfo *info) { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m index 3cda82628dd..1359c6e382d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m @@ -73,15 +73,15 @@ - (void)decidePolicyForNavigationResponseForDelegate:(FWFNavigationDelegate *)in webView:(WKWebView *)webView navigationResponse:(WKNavigationResponse *)navigationResponse completion: - (void (^)(FWFWKNavigationResponsePolicyEnumData *_Nullable, - NSError *_Nullable))completion { - NSNumber *webViewIdentifier = - @([self.instanceManager identifierWithStrongReferenceForInstance:webView]); - FWFWKNavigationResponseData *navigationResponseData = - FWFWKNavigationResponseDataFromNavigationResponse(navigationResponse); - [self - decidePolicyForNavigationResponseForDelegateWithIdentifier:@([self - identifierForDelegate:instance]) + (void (^)( + FWFWKNavigationResponsePolicyEnumData *_Nullable, + NSError *_Nullable))completion { + NSNumber *webViewIdentifier = + @([self.instanceManager identifierWithStrongReferenceForInstance:webView]); + FWFWKNavigationResponseData *navigationResponseData = + FWFWKNavigationResponseDataFromNavigationResponse(navigationResponse); + [self decidePolicyForNavigationResponseForDelegateWithIdentifier: + @([self identifierForDelegate:instance]) webViewIdentifier:webViewIdentifier navigationResponse:navigationResponseData completion:completion]; @@ -172,7 +172,7 @@ - (void)webView:(WKWebView *)webView - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse - decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { + decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { [self.navigationDelegateAPI decidePolicyForNavigationResponseForDelegate:self webView:webView diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart index 98eb06a0a47..5b358f94f23 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart @@ -189,9 +189,7 @@ extension _NavigationActionDataConverter on WKNavigationActionData { extension _NavigationResponseDataConverter on WKNavigationResponseData { WKNavigationResponse toNavigationResponse() { return WKNavigationResponse( - response: response.toNSUrlResponse(), - forMainFrame: forMainFrame - ); + response: response.toNSUrlResponse(), forMainFrame: forMainFrame); } } @@ -214,9 +212,7 @@ extension _NSUrlRequestDataConverter on NSUrlRequestData { extension _NSUrlResponseDataConverter on NSHttpUrlResponseData { NSHttpUrlResponse toNSUrlResponse() { - return NSHttpUrlResponse( - statusCode: statusCode - ); + return NSHttpUrlResponse(statusCode: statusCode); } } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart index f2fe5a1ee2e..ea2f20e030e 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart @@ -68,7 +68,7 @@ class WebKitProxy { WKNavigationAction navigationAction, )? decidePolicyForNavigationAction, - Future Function( + Future Function( WKWebView webView, WKNavigationResponse navigationResponse, )? diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 4db49711fd7..f6c5288bb51 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -615,7 +615,8 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { weakThis.target!._onPageStarted!(url ?? ''); } }, - decidePolicyForNavigationResponse: (WKWebView webView, WKNavigationResponse response) async { + decidePolicyForNavigationResponse: + (WKWebView webView, WKNavigationResponse response) async { if (weakThis.target?._onPageError != null) { weakThis.target!._onPageError!(response.response.statusCode); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart index 35553268031..a7c667dfc52 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart @@ -605,11 +605,8 @@ void main() { instanceManager.getIdentifier(navigationDelegate)!, instanceManager.getIdentifier(webView)!, WKNavigationResponseData( - response: NSHttpUrlResponseData( - statusCode: 401 - ), - forMainFrame: true - ), + response: NSHttpUrlResponseData(statusCode: 401), + forMainFrame: true), ); expect(policyData.value, WKNavigationResponsePolicyEnum.cancel); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart index ed56773742f..57cbda44bd3 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart @@ -86,16 +86,15 @@ void main() { ); late final int callbackStatusCode; - webKitDelgate.setOnPageError((int statusCode) => callbackStatusCode = statusCode); + webKitDelgate + .setOnPageError((int statusCode) => callbackStatusCode = statusCode); CapturingNavigationDelegate .lastCreatedDelegate.decidePolicyForNavigationResponse!( - WKWebView.detached(), - const WKNavigationResponse( - response: NSHttpUrlResponse(statusCode: 401), - forMainFrame: true - ), - ); + WKWebView.detached(), + const WKNavigationResponse( + response: NSHttpUrlResponse(statusCode: 401), forMainFrame: true), + ); expect(callbackStatusCode, 401); }); From 3e284c32f9b71d8deb7cbf49f1aaef71e5b09d95 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 23 Feb 2023 16:02:02 +0100 Subject: [PATCH 03/21] Adds changelogs --- .../webview_flutter/webview_flutter/CHANGELOG.md | 4 +++- .../webview_flutter_android/CHANGELOG.md | 14 +------------- .../gradle/wrapper/gradle-wrapper.properties | 5 ----- .../CHANGELOG.md | 1 + .../webview_flutter_wkwebview/CHANGELOG.md | 1 + 5 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index e911d89ee8d..db5e13bacf2 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -2,6 +2,7 @@ * Updates minimum Flutter version to 3.3. * Fixes common typos in tests and documentation. +* Adds onHttpError callback to NavigationDelegate to catch HTTP error status codes. ## 4.0.7 @@ -10,7 +11,8 @@ ## 4.0.6 -* Updates iOS minimum version in README. +* Updates the README with the migration of `WebView.initialCookies` and Hybrid Composition on + Android. ## 4.0.5 diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 953ec4dbfce..3029ff03a2e 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -22,19 +22,7 @@ ## 3.4.1 -* Fixes a potential bug where a `WebView` that was not added to the `InstanceManager` could be - returned by a `WebViewClient` or `WebChromeClient`. - -## 3.4.0 - -* Adds support to set text zoom of a page. See `AndroidWebViewController.setTextZoom`. -* Aligns Dart and Flutter SDK constraints. - -## 3.3.2 - -* Resolves compilations warnings. -* Updates compileSdkVersion to 33. -* Bumps androidx.webkit:webkit from 1.5.0 to 1.6.0. +* Adds onReceivedHttpError WebView callback to support the onPageError callback. ## 3.3.1 diff --git a/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties b/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 41dfb87909a..00000000000 --- a/packages/webview_flutter/webview_flutter_android/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 0d90e0c2f50..d94dd8e9549 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -9,6 +9,7 @@ * Adds support to track url changes. See `PlatformNavigationDelegate.setOnUrlChange`. * Aligns Dart and Flutter SDK constraints. +* Adds platform interface for onPageError callback ## 2.0.2 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index bfce2091252..3dcf8efa3c8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -20,6 +20,7 @@ ## 3.2.0 * Updates minimum Flutter version to 3.3 and iOS 11. +* Adds decidePolicyForNavigationResponse WKWebView delegate to support the onPageError callback. ## 3.1.1 From 5aec00b4a66a2ffc46ccb728c0f936f56c294639 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 23 Feb 2023 16:07:14 +0100 Subject: [PATCH 04/21] Adds dependency overrides --- .../webview_flutter/example/pubspec.yaml | 10 ++++++++++ .../webview_flutter/pubspec.yaml | 19 +++++++++++++------ .../webview_flutter_android/CHANGELOG.md | 12 +++++++++++- .../example/pubspec.yaml | 8 ++++++++ .../webview_flutter_android/pubspec.yaml | 3 +-- .../webview_flutter_web/example/pubspec.yaml | 6 ++++++ .../example/pubspec.yaml | 8 ++++++++ .../webview_flutter_wkwebview/pubspec.yaml | 3 +-- 8 files changed, 58 insertions(+), 11 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/webview_flutter/example/pubspec.yaml index 742e9a7e01b..2dda5c102ee 100644 --- a/packages/webview_flutter/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/example/pubspec.yaml @@ -38,3 +38,13 @@ flutter: - assets/sample_video.mp4 - assets/www/index.html - assets/www/styles/style.css + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_android: + path: ../../../webview_flutter/webview_flutter_android + webview_flutter_platform_interface: + path: ../../../webview_flutter/webview_flutter_platform_interface + webview_flutter_wkwebview: + path: ../../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 64535cb8f9e..c16e7c33a4f 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -19,12 +19,9 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_android: - path: ../webview_flutter_android - webview_flutter_platform_interface: - path: ../webview_flutter_platform_interface - webview_flutter_wkwebview: - path: ../webview_flutter_wkwebview + webview_flutter_android: ^3.0.0 + webview_flutter_platform_interface: ^2.0.0 + webview_flutter_wkwebview: ^3.0.0 dev_dependencies: build_runner: ^2.1.5 @@ -34,3 +31,13 @@ dev_dependencies: sdk: flutter mockito: 5.4.0 plugin_platform_interface: ^2.1.3 + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_android: + path: ../../webview_flutter/webview_flutter_android + webview_flutter_platform_interface: + path: ../../webview_flutter/webview_flutter_platform_interface + webview_flutter_wkwebview: + path: ../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 3029ff03a2e..7fff91386d5 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -21,9 +21,19 @@ * Clarifies explanation of endorsement in README. ## 3.4.1 - * Adds onReceivedHttpError WebView callback to support the onPageError callback. +## 3.4.0 + +* Adds support to set text zoom of a page. See `AndroidWebViewController.setTextZoom`. +* Aligns Dart and Flutter SDK constraints. + +## 3.3.2 + +* Resolves compilations warnings. +* Updates compileSdkVersion to 33. +* Bumps androidx.webkit:webkit from 1.5.0 to 1.6.0. + ## 3.3.1 * Updates links for the merge of flutter/plugins into flutter/packages. diff --git a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml index 83f3f00312f..a33b92e099e 100644 --- a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml @@ -35,3 +35,11 @@ flutter: - assets/sample_video.mp4 - assets/www/index.html - assets/www/styles/style.css + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_android: + path: ../../../webview_flutter/webview_flutter_android + webview_flutter_platform_interface: + path: ../../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index e696ad62114..37b38268374 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -20,8 +20,7 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: - path: ../webview_flutter_platform_interface + webview_flutter_platform_interface: ^2.0.0 dev_dependencies: build_runner: ^2.1.4 diff --git a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml index 2e1daffb1c8..c1a6f61bb2e 100644 --- a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml @@ -30,3 +30,9 @@ dev_dependencies: flutter: uses-material-design: true + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_platform_interface: + path: ../../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml index 4af215cee74..6ffb053c16e 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml @@ -34,3 +34,11 @@ flutter: - assets/sample_video.mp4 - assets/www/index.html - assets/www/styles/style.css + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_platform_interface: + path: ../../../webview_flutter/webview_flutter_platform_interface + webview_flutter_wkwebview: + path: ../../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 138784d97c3..6d3286796ca 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -20,8 +20,7 @@ dependencies: flutter: sdk: flutter path: ^1.8.0 - webview_flutter_platform_interface: - path: ../webview_flutter_platform_interface + webview_flutter_platform_interface: ^2.0.0 dev_dependencies: build_runner: ^2.1.5 From 6dcd4384e7cb00ddd40cb9d6a8c2aadc71ae24f5 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Fri, 24 Feb 2023 14:18:41 +0100 Subject: [PATCH 05/21] Fixes method not found error --- .../webview_flutter/lib/src/navigation_delegate.dart | 1 + .../plugins/webviewflutter/WebViewClientFlutterApiImpl.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart index 9b96fbcaacd..2a37d42e890 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart @@ -153,6 +153,7 @@ class NavigationDelegate { /// Invoked when a page has finished loading. final PageEventCallback? onPageFinished; + /// Invoked when a page failed loading final PageErrorCallback? onPageError; /// Invoked when a page is loading to report the progress. diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index d2e8f7be51c..c29ac1af9a2 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -101,7 +101,7 @@ public void onPageFinished( /** Passes arguments from {@link WebViewClient#onReceivedHttpError} to Dart. */ public void onPageError( - WebViewClient webViewClient, WebView webView, int statusCodeArg, Reply callback) { + WebViewClient webViewClient, WebView webView, long statusCodeArg, Reply callback) { final Long webViewIdentifier = instanceManager.getIdentifierForStrongReference(webView); if (webViewIdentifier == null) { throw new IllegalStateException("Could not find identifier for WebView."); From febaf9bb59a08ef81ec055a4a618bf814fbb2726 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Fri, 24 Feb 2023 15:20:16 +0100 Subject: [PATCH 06/21] Updates android_webview_controller_test mock & updates changelogs and readmes --- .../webview_flutter/webview_flutter/README.md | 1 + .../webview_flutter_android/CHANGELOG.md | 5 ++ ...android_webview_controller_test.mocks.dart | 58 +++++++++---------- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/README.md b/packages/webview_flutter/webview_flutter/README.md index 5338b0eb2ea..027c646ed6f 100644 --- a/packages/webview_flutter/webview_flutter/README.md +++ b/packages/webview_flutter/webview_flutter/README.md @@ -32,6 +32,7 @@ controller = WebViewController() }, onPageStarted: (String url) {}, onPageFinished: (String url) {}, + onPageError: (int statusCode) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://www.youtube.com/')) { diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 7fff91386d5..bd6689b2230 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -23,6 +23,11 @@ ## 3.4.1 * Adds onReceivedHttpError WebView callback to support the onPageError callback. +## 3.4.1 + +* Fixes a potential bug where a `WebView` that was not added to the `InstanceManager` could be + returned by a `WebViewClient` or `WebChromeClient`. + ## 3.4.0 * Adds support to set text zoom of a page. See `AndroidWebViewController.setTextZoom`. diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index 0dbf524ec3a..09643e31d7a 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -767,6 +767,11 @@ class MockAndroidWebViewProxy extends _i1.Mock })); @override _i2.WebViewClient Function({ + void Function( + _i2.WebView, + int, + )? + onPageError, void Function( _i2.WebView, String, @@ -797,6 +802,11 @@ class MockAndroidWebViewProxy extends _i1.Mock }) get createAndroidWebViewClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebViewClient), returnValue: ({ + void Function( + _i2.WebView, + int, + )? + onPageError, void Function( _i2.WebView, String, @@ -830,6 +840,11 @@ class MockAndroidWebViewProxy extends _i1.Mock Invocation.getter(#createAndroidWebViewClient), ), returnValueForMissingStub: ({ + void Function( + _i2.WebView, + int, + )? + onPageError, void Function( _i2.WebView, String, @@ -863,6 +878,11 @@ class MockAndroidWebViewProxy extends _i1.Mock Invocation.getter(#createAndroidWebViewClient), ), ) as _i2.WebViewClient Function({ + void Function( + _i2.WebView, + int, + )? + onPageError, void Function( _i2.WebView, String, @@ -1055,11 +1075,11 @@ class MockAndroidWebViewWidgetCreationParams extends _i1.Mock class MockExpensiveAndroidViewController extends _i1.Mock implements _i7.ExpensiveAndroidViewController { @override - bool get requiresViewComposition => (super.noSuchMethod( - Invocation.getter(#requiresViewComposition), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); + int get textureId => (super.noSuchMethod( + Invocation.getter(#textureId), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); @override int get viewId => (super.noSuchMethod( Invocation.getter(#viewId), @@ -1115,18 +1135,11 @@ class MockExpensiveAndroidViewController extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override - _i9.Future create({ - _i4.Size? size, - _i4.Offset? position, - }) => - (super.noSuchMethod( + _i9.Future create({_i4.Size? size}) => (super.noSuchMethod( Invocation.method( #create, [], - { - #size: size, - #position: position, - }, + {#size: size}, ), returnValue: _i9.Future.value(), returnValueForMissingStub: _i9.Future.value(), @@ -1407,12 +1420,6 @@ class MockPlatformViewsServiceProxy extends _i1.Mock class MockSurfaceAndroidViewController extends _i1.Mock implements _i7.SurfaceAndroidViewController { @override - bool get requiresViewComposition => (super.noSuchMethod( - Invocation.getter(#requiresViewComposition), - returnValue: false, - returnValueForMissingStub: false, - ) as bool); - @override int get viewId => (super.noSuchMethod( Invocation.getter(#viewId), returnValue: 0, @@ -1467,18 +1474,11 @@ class MockSurfaceAndroidViewController extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override - _i9.Future create({ - _i4.Size? size, - _i4.Offset? position, - }) => - (super.noSuchMethod( + _i9.Future create({_i4.Size? size}) => (super.noSuchMethod( Invocation.method( #create, [], - { - #size: size, - #position: position, - }, + {#size: size}, ), returnValue: _i9.Future.value(), returnValueForMissingStub: _i9.Future.value(), From 4daf1748eacb2c0773c7cd21e7780be09d111d3a Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Sat, 25 Feb 2023 19:59:32 +0100 Subject: [PATCH 07/21] Uses mocks generated with latest stable Flutter version --- ...android_webview_controller_test.mocks.dart | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index 09643e31d7a..e3faa670bc4 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -1075,11 +1075,11 @@ class MockAndroidWebViewWidgetCreationParams extends _i1.Mock class MockExpensiveAndroidViewController extends _i1.Mock implements _i7.ExpensiveAndroidViewController { @override - int get textureId => (super.noSuchMethod( - Invocation.getter(#textureId), - returnValue: 0, - returnValueForMissingStub: 0, - ) as int); + bool get requiresViewComposition => (super.noSuchMethod( + Invocation.getter(#requiresViewComposition), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); @override int get viewId => (super.noSuchMethod( Invocation.getter(#viewId), @@ -1135,11 +1135,18 @@ class MockExpensiveAndroidViewController extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override - _i9.Future create({_i4.Size? size}) => (super.noSuchMethod( + _i9.Future create({ + _i4.Size? size, + _i4.Offset? position, + }) => + (super.noSuchMethod( Invocation.method( #create, [], - {#size: size}, + { + #size: size, + #position: position, + }, ), returnValue: _i9.Future.value(), returnValueForMissingStub: _i9.Future.value(), @@ -1420,6 +1427,12 @@ class MockPlatformViewsServiceProxy extends _i1.Mock class MockSurfaceAndroidViewController extends _i1.Mock implements _i7.SurfaceAndroidViewController { @override + bool get requiresViewComposition => (super.noSuchMethod( + Invocation.getter(#requiresViewComposition), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override int get viewId => (super.noSuchMethod( Invocation.getter(#viewId), returnValue: 0, @@ -1474,11 +1487,18 @@ class MockSurfaceAndroidViewController extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override - _i9.Future create({_i4.Size? size}) => (super.noSuchMethod( + _i9.Future create({ + _i4.Size? size, + _i4.Offset? position, + }) => + (super.noSuchMethod( Invocation.method( #create, [], - {#size: size}, + { + #size: size, + #position: position, + }, ), returnValue: _i9.Future.value(), returnValueForMissingStub: _i9.Future.value(), From 832042daca12a38f868498d97939e5c92dcf2f31 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Sat, 25 Feb 2023 21:23:53 +0100 Subject: [PATCH 08/21] Removes unnecessary changes --- .../webview_flutter_web/example/pubspec.yaml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml index c1a6f61bb2e..3e3d4a77486 100644 --- a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml @@ -29,10 +29,4 @@ dev_dependencies: sdk: flutter flutter: - uses-material-design: true - - -# FOR TESTING ONLY. DO NOT MERGE. -dependency_overrides: - webview_flutter_platform_interface: - path: ../../../webview_flutter/webview_flutter_platform_interface + uses-material-design: true \ No newline at end of file From 0f7c04e9e2d1842e895db0e68331a97f7e08246e Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Sat, 25 Feb 2023 21:33:18 +0100 Subject: [PATCH 09/21] Adds new line to pubspec's --- .../webview_flutter/webview_flutter_web/example/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml index 3e3d4a77486..2e1daffb1c8 100644 --- a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml @@ -29,4 +29,4 @@ dev_dependencies: sdk: flutter flutter: - uses-material-design: true \ No newline at end of file + uses-material-design: true From 3167bd7f7f6f70ed9f14a0496d64973a4052b0da Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Tue, 28 Feb 2023 16:31:09 +0100 Subject: [PATCH 10/21] Fixes iOS issue where onPageError gets called for status codes < 400 --- .../lib/src/webkit_webview_controller.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index f6c5288bb51..05a855dc314 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -617,7 +617,8 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { }, decidePolicyForNavigationResponse: (WKWebView webView, WKNavigationResponse response) async { - if (weakThis.target?._onPageError != null) { + if (weakThis.target?._onPageError != null && + response.response.statusCode >= 400) { weakThis.target!._onPageError!(response.response.statusCode); } From 0890c1e3138c79d4a7f3cd5ccd530aa4eefb8231 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Tue, 7 Mar 2023 15:53:04 +0100 Subject: [PATCH 11/21] Introduces HttpResponseError object --- .../webview_flutter_test.dart | 1 + .../webview_flutter/example/lib/main.dart | 4 +- .../example/lib/simple_example.dart | 2 +- .../example/test/main_test.dart | 2 +- .../lib/src/navigation_delegate.dart | 17 +++---- .../webview_flutter/lib/webview_flutter.dart | 2 + .../test/navigation_delegate_test.dart | 8 +-- .../test/navigation_delegate_test.mocks.dart | 6 +-- .../test/webview_controller_test.mocks.dart | 6 +-- .../WebViewClientFlutterApiImpl.java | 27 ++++++++-- .../WebViewClientHostApiImpl.java | 11 ++-- .../example/lib/main.dart | 4 +- .../lib/src/android_proxy.dart | 7 ++- .../lib/src/android_webview.dart | 30 ++++++++--- .../lib/src/android_webview_api_impls.dart | 22 ++++++-- .../lib/src/android_webview_controller.dart | 28 ++++++++--- .../pigeons/android_webview.dart | 15 +++++- .../android_navigation_delegate_test.dart | 30 +++++++---- .../test/android_webview_controller_test.dart | 7 ++- ...android_webview_controller_test.mocks.dart | 50 ++++++++++--------- .../test/android_webview_test.dart | 28 ++++++++--- .../lib/src/platform_navigation_delegate.dart | 3 -- .../example/lib/main.dart | 4 +- .../ios/Classes/FWFDataConverters.m | 6 +++ .../lib/src/webkit_webview_controller.dart | 11 ++-- .../test/webkit_navigation_delegate_test.dart | 11 ++-- 26 files changed, 231 insertions(+), 111 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 7763327df58..d9dca4618dc 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -20,6 +20,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter_android/webview_flutter_android.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; Future main() async { diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index fc726a1f87b..7117bf847f4 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart @@ -119,8 +119,8 @@ class _WebViewExampleState extends State { onPageFinished: (String url) { debugPrint('Page finished loading: $url'); }, - onPageError: (int statusCode) { - debugPrint('Error occured on page: $statusCode'); + onHttpError: (HttpResponseError error) { + debugPrint('Error occured on page: ${error.statusCode}'); }, onWebResourceError: (WebResourceError error) { debugPrint(''' diff --git a/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart b/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart index 3315714df64..06a7bd31dd8 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/simple_example.dart @@ -34,7 +34,7 @@ class _WebViewExampleState extends State { }, onPageStarted: (String url) {}, onPageFinished: (String url) {}, - onPageError: (int statusCode) {}, + onHttpError: (HttpResponseError error) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://www.youtube.com/')) { diff --git a/packages/webview_flutter/webview_flutter/example/test/main_test.dart b/packages/webview_flutter/webview_flutter/example/test/main_test.dart index 67ecc15c785..8b2bd1c7299 100644 --- a/packages/webview_flutter/webview_flutter/example/test/main_test.dart +++ b/packages/webview_flutter/webview_flutter/example/test/main_test.dart @@ -107,7 +107,7 @@ class FakeNavigationDelegate extends PlatformNavigationDelegate { Future setOnPageStarted(PageEventCallback onPageStarted) async {} @override - Future setOnPageError(PageErrorCallback onPageStarted) async {} + Future setOnHttpError(HttpResponseErrorCallback onHttpError) async {} @override Future setOnProgress(ProgressCallback onProgress) async {} diff --git a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart index 2a37d42e890..5211b519230 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/navigation_delegate.dart @@ -41,15 +41,15 @@ class NavigationDelegate { onNavigationRequest, void Function(String url)? onPageStarted, void Function(String url)? onPageFinished, - void Function(int statusCode)? onPageError, void Function(int progress)? onProgress, + void Function(HttpResponseError error)? onHttpError, void Function(WebResourceError error)? onWebResourceError, }) : this.fromPlatformCreationParams( const PlatformNavigationDelegateCreationParams(), onNavigationRequest: onNavigationRequest, onPageStarted: onPageStarted, onPageFinished: onPageFinished, - onPageError: onPageError, + onHttpError: onHttpError, onProgress: onProgress, onWebResourceError: onWebResourceError, ); @@ -89,15 +89,15 @@ class NavigationDelegate { onNavigationRequest, void Function(String url)? onPageStarted, void Function(String url)? onPageFinished, - void Function(int statusCode)? onPageError, void Function(int progress)? onProgress, + void Function(HttpResponseError error)? onHttpError, void Function(WebResourceError error)? onWebResourceError, }) : this.fromPlatform( PlatformNavigationDelegate(params), onNavigationRequest: onNavigationRequest, onPageStarted: onPageStarted, onPageFinished: onPageFinished, - onPageError: onPageError, + onHttpError: onHttpError, onProgress: onProgress, onWebResourceError: onWebResourceError, ); @@ -108,8 +108,8 @@ class NavigationDelegate { this.onNavigationRequest, this.onPageStarted, this.onPageFinished, - this.onPageError, this.onProgress, + void Function(HttpResponseError error)? onHttpError, this.onWebResourceError, }) { if (onNavigationRequest != null) { @@ -121,8 +121,8 @@ class NavigationDelegate { if (onPageFinished != null) { platform.setOnPageFinished(onPageFinished!); } - if (onPageError != null) { - platform.setOnPageError(onPageError!); + if (onHttpError != null) { + platform.setOnHttpError(onHttpError); } if (onProgress != null) { platform.setOnProgress(onProgress!); @@ -153,9 +153,6 @@ class NavigationDelegate { /// Invoked when a page has finished loading. final PageEventCallback? onPageFinished; - /// Invoked when a page failed loading - final PageErrorCallback? onPageError; - /// Invoked when a page is loading to report the progress. final ProgressCallback? onProgress; diff --git a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart index 112966d4776..2dd34bf0c3d 100644 --- a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart @@ -6,6 +6,8 @@ library webview_flutter; export 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart' show + HttpResponseError, + HttpResponseErrorCallback, JavaScriptMessage, JavaScriptMode, LoadRequestMethod, diff --git a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart index bff3cedd92f..c897f4a887e 100644 --- a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.dart @@ -52,16 +52,16 @@ void main() { verify(delegate.platform.setOnPageFinished(onPageFinished)); }); - test('onPageError', () async { + test('onHttpError', () async { WebViewPlatform.instance = TestWebViewPlatform(); - void onPageError(int statusCode) {} + void onHttpError(HttpResponseError error) {} final NavigationDelegate delegate = NavigationDelegate( - onPageError: onPageError, + onHttpError: onHttpError, ); - verify(delegate.platform.setOnPageError(onPageError)); + verify(delegate.platform.setOnHttpError(onHttpError)); }); test('onProgress', () async { 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 d4b481b365e..d115d2d6bd7 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 @@ -208,11 +208,11 @@ class MockPlatformNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i8.Future.value(), ) as _i8.Future); @override - _i8.Future setOnPageError(_i3.PageErrorCallback? onPageError) => + _i8.Future setOnHttpError(_i3.HttpResponseErrorCallback? onHttpError) => (super.noSuchMethod( Invocation.method( - #setOnPageError, - [onPageError], + #setOnHttpError, + [onHttpError], ), returnValue: _i8.Future.value(), returnValueForMissingStub: _i8.Future.value(), 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 e2524784795..961a212c8f1 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 @@ -394,11 +394,11 @@ class MockPlatformNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); @override - _i5.Future setOnPageError(_i6.PageErrorCallback? onPageError) => + _i5.Future setOnHttpError(_i6.HttpResponseErrorCallback? onHttpError) => (super.noSuchMethod( Invocation.method( - #setOnPageError, - [onPageError], + #setOnHttpError, + [onHttpError], ), returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index c29ac1af9a2..096a750d5ec 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -8,6 +8,7 @@ import android.os.Build; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.RequiresApi; @@ -65,6 +66,16 @@ static GeneratedAndroidWebView.WebResourceRequestData createWebResourceRequestDa return requestData.build(); } + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + static GeneratedAndroidWebView.WebResourceResponseData createWebResourceResponseData( + WebResourceResponse response) { + final GeneratedAndroidWebView.WebResourceResponseData.Builder responseData = + new GeneratedAndroidWebView.WebResourceResponseData.Builder() + .setStatusCode((long) response.getStatusCode()); + + return responseData.build(); + } + /** * Creates a Flutter api that sends messages to Dart. * @@ -100,13 +111,23 @@ public void onPageFinished( } /** Passes arguments from {@link WebViewClient#onReceivedHttpError} to Dart. */ - public void onPageError( - WebViewClient webViewClient, WebView webView, long statusCodeArg, Reply callback) { + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public void onReceivedHttpError( + WebViewClient webViewClient, + WebView webView, + WebResourceRequest request, + WebResourceResponse response, + Reply callback) { final Long webViewIdentifier = instanceManager.getIdentifierForStrongReference(webView); if (webViewIdentifier == null) { throw new IllegalStateException("Could not find identifier for WebView."); } - onPageError(getIdentifierForClient(webViewClient), webViewIdentifier, statusCodeArg, callback); + onReceivedHttpError( + getIdentifierForClient(webViewClient), + webViewIdentifier, + createWebResourceRequestData(request), + createWebResourceResponseData(response), + callback); } /** diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java index 78fd8c76265..6a74864adc5 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java @@ -57,8 +57,8 @@ public void onPageFinished(WebView view, String url) { @Override public void onReceivedHttpError( - WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { - flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); + WebView view, WebResourceRequest request, WebResourceResponse response) { + flutterApi.onReceivedHttpError(this, view, request, response, reply -> {}); } @Override @@ -124,12 +124,11 @@ public void onPageFinished(WebView view, String url) { flutterApi.onPageFinished(this, view, url, reply -> {}); } + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedHttpError( - WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - flutterApi.onPageError(this, view, errorResponse.getStatusCode(), reply -> {}); - } + @NonNull WebView view, @NonNull WebResourceRequest request, WebResourceResponse response) { + flutterApi.onReceivedHttpError(this, view, request, response, reply -> {}); } // This method is only called when the WebViewFeature.RECEIVE_WEB_RESOURCE_ERROR feature is diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart index b3141063d78..2aaa0e18e72 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart @@ -107,8 +107,8 @@ class _WebViewExampleState extends State { ..setOnPageFinished((String url) { debugPrint('Page finished loading: $url'); }) - ..setOnPageError((int statusCode) { - debugPrint('Error occured on page: $statusCode'); + ..setOnHttpError((HttpResponseError error) { + debugPrint('Http error occured on page: ${error.statusCode}'); }) ..setOnWebResourceError((WebResourceError error) { debugPrint(''' diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart index 3bd570aea2c..e099b5bd9c3 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart @@ -41,7 +41,12 @@ class AndroidWebViewProxy { final android_webview.WebViewClient Function({ void Function(android_webview.WebView webView, String url)? onPageStarted, void Function(android_webview.WebView webView, String url)? onPageFinished, - void Function(android_webview.WebView webView, int statusCode)? onPageError, + void Function( + android_webview.WebView webView, + android_webview.WebResourceRequest request, + android_webview.WebResourceResponse response, + )? + onReceivedHttpError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index 9f687656ff5..a697550146d 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -673,7 +673,7 @@ class WebViewClient extends JavaObject { WebViewClient({ this.onPageStarted, this.onPageFinished, - this.onPageError, + this.onReceivedHttpError, this.onReceivedRequestError, @Deprecated('Only called on Android version < 23.') this.onReceivedError, this.requestLoading, @@ -693,7 +693,7 @@ class WebViewClient extends JavaObject { WebViewClient.detached({ this.onPageStarted, this.onPageFinished, - this.onPageError, + this.onReceivedHttpError, this.onReceivedRequestError, @Deprecated('Only called on Android version < 23.') this.onReceivedError, this.requestLoading, @@ -805,10 +805,13 @@ class WebViewClient extends JavaObject { final void Function(WebView webView, String url)? onPageFinished; /// Notify the host application that an HTTP error has been received from the - /// server while loading a resource. HTTP errors have status codes >= 400. - /// This callback will be called for any resource (iframe, image, etc.), not just for the main page. - /// Thus, it is recommended to perform minimum required work in this callback. - final void Function(WebView webView, int statusCode)? onPageError; + /// server while loading a resource. + /// + /// HTTP errors have status codes >= 400. This callback will be called for any + /// resource (iframe, image, etc.), not just for the main page. Thus, it is + /// recommended to perform minimum required work in this callback. + final void Function(WebView webView, WebResourceRequest request, + WebResourceResponse response)? onReceivedHttpError; /// Report web resource loading error to the host application. /// @@ -871,7 +874,7 @@ class WebViewClient extends JavaObject { return WebViewClient.detached( onPageStarted: onPageStarted, onPageFinished: onPageFinished, - onPageError: onPageError, + onReceivedHttpError: onReceivedHttpError, onReceivedRequestError: onReceivedRequestError, onReceivedError: onReceivedError, requestLoading: requestLoading, @@ -1093,6 +1096,19 @@ class WebResourceRequest { final Map requestHeaders; } +/// Encapsulates information about the web resource response. +/// +/// See [WebViewClient.onReceivedHttpError]. +class WebResourceResponse { + /// Constructs a [WebResourceResponse]. + WebResourceResponse({ + required this.statusCode, + }); + + /// The HTTP status code associated with the response. + final int statusCode; +} + /// Encapsulates information about errors occurred during loading of web resources. /// /// See [WebViewClient.onReceivedRequestError]. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart index 8f83260bf5c..7d456bf4c07 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart @@ -27,6 +27,13 @@ WebResourceRequest _toWebResourceRequest(WebResourceRequestData data) { ); } +/// Converts [WebResourceResponseData] to [WebResourceResponse] +WebResourceResponse _toWebResourceResponse(WebResourceResponseData data) { + return WebResourceResponse( + statusCode: data.statusCode, + ); +} + /// Converts [WebResourceErrorData] to [WebResourceError]. WebResourceError _toWebResourceError(WebResourceErrorData data) { return WebResourceError( @@ -648,7 +655,12 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { } @override - void onPageError(int instanceId, int webViewInstanceId, int statusCode) { + void onReceivedHttpError( + int instanceId, + int webViewInstanceId, + WebResourceRequestData request, + WebResourceResponseData response, + ) { final WebViewClient? instance = instanceManager .getInstanceWithWeakReference(instanceId) as WebViewClient?; final WebView? webViewInstance = instanceManager @@ -661,8 +673,12 @@ class WebViewClientFlutterApiImpl extends WebViewClientFlutterApi { webViewInstance != null, 'InstanceManager does not contain an WebView with instanceId: $webViewInstanceId', ); - if (instance!.onPageError != null) { - instance.onPageError!(webViewInstance!, statusCode); + if (instance!.onReceivedHttpError != null) { + instance.onReceivedHttpError!( + webViewInstance!, + _toWebResourceRequest(request), + _toWebResourceResponse(response), + ); } } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index 73d9aba9ed9..4ed7e2c6ec4 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -672,6 +672,15 @@ class AndroidWebResourceError extends WebResourceError { } } +/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred. +@immutable +class AndroidHttpResponseError extends HttpResponseError { + /// Creates a new [AndroidHttpResponseError]. + const AndroidHttpResponseError._({ + required super.statusCode, + }); +} + /// Object specifying creation parameters for creating a [AndroidNavigationDelegate]. /// /// When adding additional fields make sure they can be null or have a default @@ -729,9 +738,14 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { weakThis.target!._onPageStarted!(url); } }, - onPageError: (android_webview.WebView webView, int statusCode) { - if (weakThis.target?._onPageError != null) { - weakThis.target!._onPageError!(statusCode); + onReceivedHttpError: ( + android_webview.WebView webView, + android_webview.WebResourceRequest request, + android_webview.WebResourceResponse response, + ) { + if (weakThis.target?._onHttpError != null) { + weakThis.target!._onHttpError!( + HttpResponseError(statusCode: response.statusCode)); } }, onReceivedRequestError: ( @@ -834,7 +848,7 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { PageEventCallback? _onPageFinished; PageEventCallback? _onPageStarted; - PageErrorCallback? _onPageError; + HttpResponseErrorCallback? _onHttpError; ProgressCallback? _onProgress; WebResourceErrorCallback? _onWebResourceError; NavigationRequestCallback? _onNavigationRequest; @@ -907,10 +921,10 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate { } @override - Future setOnPageError( - PageErrorCallback onPageError, + Future setOnHttpError( + HttpResponseErrorCallback onHttpError, ) async { - _onPageError = onPageError; + _onHttpError = onHttpError; } @override diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart index 4d741011a42..d3f9d49e7ae 100644 --- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart @@ -81,6 +81,14 @@ class WebResourceRequestData { Map requestHeaders; } +class WebResourceResponseData { + WebResourceResponseData( + this.statusCode, + ); + + int statusCode; +} + class WebResourceErrorData { WebResourceErrorData(this.errorCode, this.description); @@ -270,7 +278,12 @@ abstract class WebViewClientFlutterApi { void onPageFinished(int instanceId, int webViewInstanceId, String url); - void onPageError(int instanceId, int webViewInstanceId, int statusCode); + void onReceivedHttpError( + int instanceId, + int webViewInstanceId, + WebResourceRequestData request, + WebResourceResponseData response, + ); void onReceivedRequestError( int instanceId, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart index 8bcc03f014c..62c11fbc77f 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_navigation_delegate_test.dart @@ -55,19 +55,27 @@ void main() { expect(callbackUrl, 'https://www.google.com'); }); - test('onPageError', () { + test('onHttpError from onReceivedHttpError', () { final AndroidNavigationDelegate androidNavigationDelegate = AndroidNavigationDelegate(_buildCreationParams()); - late final int statusCode; - androidNavigationDelegate.setOnPageError((int code) => statusCode = code); - - CapturingWebViewClient.lastCreatedDelegate.onPageError!( - android_webview.WebView.detached(), - 401, - ); - - expect(statusCode, 401); + late final HttpResponseError callbackError; + androidNavigationDelegate.setOnHttpError( + (HttpResponseError htppError) => callbackError = htppError); + + CapturingWebViewClient.lastCreatedDelegate.onReceivedHttpError!( + android_webview.WebView.detached(), + android_webview.WebResourceRequest( + url: 'https://www.google.com', + isForMainFrame: false, + isRedirect: true, + hasGesture: true, + method: 'GET', + requestHeaders: {'X-Mock': 'mocking'}, + ), + android_webview.WebResourceResponse(statusCode: 401)); + + expect(callbackError.statusCode, 401); }); test('onWebResourceError from onReceivedRequestError', () { @@ -482,7 +490,7 @@ class CapturingWebViewClient extends android_webview.WebViewClient { CapturingWebViewClient({ super.onPageFinished, super.onPageStarted, - super.onPageError, + super.onReceivedHttpError, super.onReceivedError, super.onReceivedRequestError, super.requestLoading, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index 76eb0f5f9d4..cda0301b0a0 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -87,8 +87,11 @@ void main() { onPageFinished, void Function(android_webview.WebView webView, String url)? onPageStarted, - void Function(android_webview.WebView webView, int statusCode)? - onPageError, + void Function( + android_webview.WebView webView, + android_webview.WebResourceRequest request, + android_webview.WebResourceResponse response)? + onReceivedHttpError, @Deprecated('Only called on Android version < 23.') void Function( android_webview.WebView webView, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index e3faa670bc4..97a1e35a9bf 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -323,11 +323,11 @@ class MockAndroidNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i9.Future.value(), ) as _i9.Future); @override - _i9.Future setOnPageError(_i3.PageErrorCallback? onPageError) => + _i9.Future setOnHttpError(_i3.HttpResponseErrorCallback? onHttpError) => (super.noSuchMethod( Invocation.method( - #setOnPageError, - [onPageError], + #setOnHttpError, + [onHttpError], ), returnValue: _i9.Future.value(), returnValueForMissingStub: _i9.Future.value(), @@ -767,11 +767,6 @@ class MockAndroidWebViewProxy extends _i1.Mock })); @override _i2.WebViewClient Function({ - void Function( - _i2.WebView, - int, - )? - onPageError, void Function( _i2.WebView, String, @@ -786,6 +781,12 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, )? onReceivedError, + void Function( + _i2.WebView, + _i2.WebResourceRequest, + _i2.WebResourceResponse, + )? + onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -802,11 +803,6 @@ class MockAndroidWebViewProxy extends _i1.Mock }) get createAndroidWebViewClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebViewClient), returnValue: ({ - void Function( - _i2.WebView, - int, - )? - onPageError, void Function( _i2.WebView, String, @@ -821,6 +817,12 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, )? onReceivedError, + void Function( + _i2.WebView, + _i2.WebResourceRequest, + _i2.WebResourceResponse, + )? + onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -840,11 +842,6 @@ class MockAndroidWebViewProxy extends _i1.Mock Invocation.getter(#createAndroidWebViewClient), ), returnValueForMissingStub: ({ - void Function( - _i2.WebView, - int, - )? - onPageError, void Function( _i2.WebView, String, @@ -859,6 +856,12 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, )? onReceivedError, + void Function( + _i2.WebView, + _i2.WebResourceRequest, + _i2.WebResourceResponse, + )? + onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -878,11 +881,6 @@ class MockAndroidWebViewProxy extends _i1.Mock Invocation.getter(#createAndroidWebViewClient), ), ) as _i2.WebViewClient Function({ - void Function( - _i2.WebView, - int, - )? - onPageError, void Function( _i2.WebView, String, @@ -897,6 +895,12 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, )? onReceivedError, + void Function( + _i2.WebView, + _i2.WebResourceRequest, + _i2.WebResourceResponse, + )? + onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart index 6530f6f57be..4f9790d6a7a 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart @@ -634,21 +634,35 @@ void main() { expect(result, [mockWebView, 'https://www.google.com']); }); - test('onPageError', () { + test('onReceivedHttpError', () { late final List result; - when(mockWebViewClient.onPageError).thenReturn( - (WebView webView, int statusCode) { - result = [webView, statusCode]; + when(mockWebViewClient.onReceivedHttpError).thenReturn( + ( + WebView webView, + WebResourceRequest request, + WebResourceResponse response, + ) { + result = [webView, request, response]; }, ); - flutterApi.onPageError( + flutterApi.onReceivedHttpError( mockWebViewClientInstanceId, mockWebViewInstanceId, - 401, + WebResourceRequestData( + url: 'https://www.google.com', + isForMainFrame: true, + hasGesture: true, + method: 'GET', + isRedirect: false, + requestHeaders: {}, + ), + WebResourceResponseData( + statusCode: 401, + ), ); - expect(result, [mockWebView, 401]); + expect(result, [mockWebView, isNotNull, isNotNull]); }); test('onReceivedRequestError', () { 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 0840cb67358..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 @@ -16,9 +16,6 @@ typedef NavigationRequestCallback = FutureOr Function( /// Signature for callbacks that report page events triggered by the native web view. typedef PageEventCallback = void Function(String url); -/// Signature for callbacks that report errors during loading a page. -typedef PageErrorCallback = void Function(int statusCode); - /// Signature for callbacks that report loading progress of a page. typedef ProgressCallback = void Function(int progress); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart index 737308f520d..80d61e6bd2f 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart @@ -108,8 +108,8 @@ class _WebViewExampleState extends State { ..setOnPageFinished((String url) { debugPrint('Page finished loading: $url'); }) - ..setOnPageError((int statusCode) { - debugPrint('Error occured on page: $statusCode'); + ..setOnHttpError((HttpResponseError error) { + debugPrint('Error occured on page: ${error.statusCode}'); }) ..setOnWebResourceError((WebResourceError error) { debugPrint(''' diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m index 9e55a789ad0..9cbb7143dac 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFDataConverters.m @@ -182,6 +182,12 @@ WKAudiovisualMediaTypes FWFWKAudiovisualMediaTypeFromEnumData( forMainFrame:@(response.forMainFrame)]; } +/// Cast the NSURLResponse object to NSHTTPURLResponse. +/// +/// NSURLResponse doesn't contain the status code so it must be cast to NSHTTPURLResponse. +/// This cast will always succeed because the NSURLResponse object actually is an instance of +/// NSHTTPURLResponse. See: +/// https://developer.apple.com/documentation/foundation/nsurlresponse#overview FWFNSHttpUrlResponseData *FWFNSHttpUrlResponseDataFromNSURLResponse(NSURLResponse *response) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; return [FWFNSHttpUrlResponseData makeWithStatusCode:@(httpResponse.statusCode)]; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 05a855dc314..4a65aa7e48b 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -617,9 +617,10 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { }, decidePolicyForNavigationResponse: (WKWebView webView, WKNavigationResponse response) async { - if (weakThis.target?._onPageError != null && + if (weakThis.target?._onHttpError != null && response.response.statusCode >= 400) { - weakThis.target!._onPageError!(response.response.statusCode); + weakThis.target!._onHttpError!( + HttpResponseError(statusCode: response.response.statusCode)); } return WKNavigationResponsePolicy.allow; @@ -697,7 +698,7 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { PageEventCallback? _onPageFinished; PageEventCallback? _onPageStarted; - PageErrorCallback? _onPageError; + HttpResponseErrorCallback? _onHttpError; ProgressCallback? _onProgress; WebResourceErrorCallback? _onWebResourceError; NavigationRequestCallback? _onNavigationRequest; @@ -713,8 +714,8 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { } @override - Future setOnPageError(PageErrorCallback onPageError) async { - _onPageError = onPageError; + Future setOnHttpError(HttpResponseErrorCallback onHttpError) async { + _onHttpError = onHttpError; } @override diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart index 57cbda44bd3..97429d46ad4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart @@ -85,9 +85,12 @@ void main() { ), ); - late final int callbackStatusCode; - webKitDelgate - .setOnPageError((int statusCode) => callbackStatusCode = statusCode); + late final HttpResponseError callbackError; + void onHttpError(HttpResponseError error) { + callbackError = error; + } + + webKitDelgate.setOnHttpError(onHttpError); CapturingNavigationDelegate .lastCreatedDelegate.decidePolicyForNavigationResponse!( @@ -96,7 +99,7 @@ void main() { response: NSHttpUrlResponse(statusCode: 401), forMainFrame: true), ); - expect(callbackStatusCode, 401); + expect(callbackError.statusCode, 401); }); test('onWebResourceError from didFailNavigation', () { From 2f93d5f037c48e84b14c75dc241ef678dd4ea8e9 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Tue, 7 Mar 2023 16:26:35 +0100 Subject: [PATCH 12/21] Adds generated files --- .../webview_flutter/CHANGELOG.md | 3 +- .../webview_flutter_android/CHANGELOG.md | 11 + .../GeneratedAndroidWebView.java | 274 ++++++++++++------ .../lib/src/android_webview.g.dart | 67 ++++- .../test/test_android_webview.g.dart | 1 + .../webview_flutter_wkwebview/CHANGELOG.md | 5 + .../ios/Classes/FWFGeneratedWebKitApis.m | 4 + 7 files changed, 267 insertions(+), 98 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index db5e13bacf2..205464741a7 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -11,8 +11,7 @@ ## 4.0.6 -* Updates the README with the migration of `WebView.initialCookies` and Hybrid Composition on - Android. +* Updates iOS minimum version in README. ## 4.0.5 diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index bd6689b2230..f16ce45320b 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -23,6 +23,17 @@ ## 3.4.1 * Adds onReceivedHttpError WebView callback to support the onPageError callback. +## 3.4.0 + +* Adds support to set text zoom of a page. See `AndroidWebViewController.setTextZoom`. +* Aligns Dart and Flutter SDK constraints. + +## 3.3.2 + +* Resolves compilations warnings. +* Updates compileSdkVersion to 33. +* Bumps androidx.webkit:webkit from 1.5.0 to 1.6.0. + ## 3.4.1 * Fixes a potential bug where a `WebView` that was not added to the `InstanceManager` could be diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java index 507c07a70bc..d85e4fe6ecf 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java @@ -24,15 +24,6 @@ /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) public class GeneratedAndroidWebView { - @NonNull - private static ArrayList wrapError(@NonNull Throwable exception) { - ArrayList errorList = new ArrayList(3); - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); - return errorList; - } /** * Mode of how to select files for a file chooser. @@ -71,7 +62,7 @@ private FileChooserMode(final int index) { } /** Generated class from Pigeon that represents data sent in messages. */ - public static final class FileChooserModeEnumData { + public static class FileChooserModeEnumData { private @NonNull FileChooserMode value; public @NonNull FileChooserMode getValue() { @@ -89,7 +80,6 @@ public void setValue(@NonNull FileChooserMode setterArg) { private FileChooserModeEnumData() {} public static final class Builder { - private @Nullable FileChooserMode value; public @NonNull Builder setValue(@NonNull FileChooserMode setterArg) { @@ -120,7 +110,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static final class WebResourceRequestData { + public static class WebResourceRequestData { private @NonNull String url; public @NonNull String getUrl() { @@ -200,7 +190,6 @@ public void setRequestHeaders(@NonNull Map setterArg) { private WebResourceRequestData() {} public static final class Builder { - private @Nullable String url; public @NonNull Builder setUrl(@NonNull String setterArg) { @@ -286,7 +275,58 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static final class WebResourceErrorData { + public static class WebResourceResponseData { + private @NonNull Long statusCode; + + public @NonNull Long getStatusCode() { + return statusCode; + } + + public void setStatusCode(@NonNull Long setterArg) { + if (setterArg == null) { + throw new IllegalStateException("Nonnull field \"statusCode\" is null."); + } + this.statusCode = setterArg; + } + + /** Constructor is private to enforce null safety; use Builder. */ + private WebResourceResponseData() {} + + public static final class Builder { + private @Nullable Long statusCode; + + public @NonNull Builder setStatusCode(@NonNull Long setterArg) { + this.statusCode = setterArg; + return this; + } + + public @NonNull WebResourceResponseData build() { + WebResourceResponseData pigeonReturn = new WebResourceResponseData(); + pigeonReturn.setStatusCode(statusCode); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList(1); + toListResult.add(statusCode); + return toListResult; + } + + static @NonNull WebResourceResponseData fromList(@NonNull ArrayList list) { + WebResourceResponseData pigeonResult = new WebResourceResponseData(); + Object statusCode = list.get(0); + pigeonResult.setStatusCode( + (statusCode == null) + ? null + : ((statusCode instanceof Integer) ? (Integer) statusCode : (Long) statusCode)); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static class WebResourceErrorData { private @NonNull Long errorCode; public @NonNull Long getErrorCode() { @@ -317,7 +357,6 @@ public void setDescription(@NonNull String setterArg) { private WebResourceErrorData() {} public static final class Builder { - private @Nullable Long errorCode; public @NonNull Builder setErrorCode(@NonNull Long setterArg) { @@ -362,7 +401,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static final class WebViewPoint { + public static class WebViewPoint { private @NonNull Long x; public @NonNull Long getX() { @@ -393,7 +432,6 @@ public void setY(@NonNull Long setterArg) { private WebViewPoint() {} public static final class Builder { - private @Nullable Long x; public @NonNull Builder setX(@NonNull Long setterArg) { @@ -494,7 +532,6 @@ static void setup(BinaryMessenger binaryMessenger, InstanceManagerHostApi api) { *

Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface JavaObjectHostApi { - void dispose(@NonNull Long identifier); /** The codec used by JavaObjectHostApi. */ @@ -512,7 +549,7 @@ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -548,7 +585,6 @@ public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -563,12 +599,13 @@ public void dispose(@NonNull Long identifierArg, Reply callback) { binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); channel.send( new ArrayList(Collections.singletonList(identifierArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CookieManagerHostApi { - void clearCookies(Result result); void setCookie(@NonNull String url, @NonNull String value); @@ -591,7 +628,7 @@ static void setup(BinaryMessenger binaryMessenger, CookieManagerHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { Result resultCallback = new Result() { @@ -623,7 +660,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -660,6 +697,7 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return WebViewPoint.fromList((ArrayList) readValue(buffer)); + default: return super.readValueOfType(type, buffer); } @@ -764,7 +802,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -791,7 +829,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -830,7 +868,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -871,7 +909,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -909,7 +947,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -945,7 +983,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -973,7 +1011,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1001,7 +1039,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1029,7 +1067,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1056,7 +1094,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1083,7 +1121,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1110,7 +1148,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1145,7 +1183,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1190,7 +1228,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1218,7 +1256,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1256,7 +1294,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1294,7 +1332,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1322,7 +1360,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1350,7 +1388,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1381,7 +1419,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1408,7 +1446,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1445,7 +1483,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1483,7 +1521,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1521,7 +1559,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1553,7 +1591,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1585,7 +1623,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1650,7 +1688,6 @@ public void create(@NonNull Long identifierArg, Reply callback) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebSettingsHostApi { - void create(@NonNull Long instanceId, @NonNull Long webViewInstanceId); void setDomStorageEnabled(@NonNull Long instanceId, @NonNull Boolean flag); @@ -1694,7 +1731,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1729,7 +1766,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1763,7 +1800,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1797,7 +1834,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1831,7 +1868,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1865,7 +1902,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1897,7 +1934,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1931,7 +1968,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1965,7 +2002,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1999,7 +2036,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2033,7 +2070,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2067,7 +2104,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2101,7 +2138,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2163,7 +2200,6 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface JavaScriptChannelHostApi { - void create(@NonNull Long instanceId, @NonNull String channelName); /** The codec used by JavaScriptChannelHostApi. */ @@ -2182,7 +2218,7 @@ static void setup(BinaryMessenger binaryMessenger, JavaScriptChannelHostApi api) if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2217,7 +2253,6 @@ public JavaScriptChannelFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2235,12 +2270,13 @@ public void postMessage( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, messageArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebViewClientHostApi { - void create(@NonNull Long instanceId); void setSynchronousReturnValueForShouldOverrideUrlLoading( @@ -2262,7 +2298,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2291,7 +2327,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2329,8 +2365,13 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return WebResourceErrorData.fromList((ArrayList) readValue(buffer)); + case (byte) 129: return WebResourceRequestData.fromList((ArrayList) readValue(buffer)); + + case (byte) 130: + return WebResourceResponseData.fromList((ArrayList) readValue(buffer)); + default: return super.readValueOfType(type, buffer); } @@ -2344,6 +2385,9 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { } else if (value instanceof WebResourceRequestData) { stream.write(129); writeValue(stream, ((WebResourceRequestData) value).toList()); + } else if (value instanceof WebResourceResponseData) { + stream.write(130); + writeValue(stream, ((WebResourceResponseData) value).toList()); } else { super.writeValue(stream, value); } @@ -2358,7 +2402,6 @@ public WebViewClientFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2379,7 +2422,9 @@ public void onPageStarted( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } public void onPageFinished( @@ -2394,7 +2439,28 @@ public void onPageFinished( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); + } + + public void onReceivedHttpError( + @NonNull Long instanceIdArg, + @NonNull Long webViewInstanceIdArg, + @NonNull WebResourceRequestData requestArg, + @NonNull WebResourceResponseData responseArg, + Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError", + getCodec()); + channel.send( + new ArrayList( + Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg, responseArg)), + channelReply -> { + callback.reply(null); + }); } public void onReceivedRequestError( @@ -2411,7 +2477,9 @@ public void onReceivedRequestError( channel.send( new ArrayList( Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg, errorArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } public void onReceivedError( @@ -2434,7 +2502,9 @@ public void onReceivedError( errorCodeArg, descriptionArg, failingUrlArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } public void requestLoading( @@ -2449,7 +2519,9 @@ public void requestLoading( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } public void urlLoading( @@ -2462,12 +2534,13 @@ public void urlLoading( binaryMessenger, "dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading", getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface DownloadListenerHostApi { - void create(@NonNull Long instanceId); /** The codec used by DownloadListenerHostApi. */ @@ -2486,7 +2559,7 @@ static void setup(BinaryMessenger binaryMessenger, DownloadListenerHostApi api) if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2516,7 +2589,6 @@ public DownloadListenerFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2547,12 +2619,13 @@ public void onDownloadStart( contentDispositionArg, mimetypeArg, contentLengthArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebChromeClientHostApi { - void create(@NonNull Long instanceId); void setSynchronousReturnValueForOnShowFileChooser( @@ -2574,7 +2647,7 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2603,7 +2676,7 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2632,7 +2705,6 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface FlutterAssetManagerHostApi { - @NonNull List list(@NonNull String path); @@ -2655,7 +2727,7 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2684,7 +2756,7 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2714,7 +2786,6 @@ public WebChromeClientFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2735,7 +2806,9 @@ public void onProgressChanged( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, progressArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } public void onShowFileChooser( @@ -2760,7 +2833,6 @@ public void onShowFileChooser( } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebStorageHostApi { - void create(@NonNull Long instanceId); void deleteAllData(@NonNull Long instanceId); @@ -2780,7 +2852,7 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2807,7 +2879,7 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList(); + ArrayList wrapped = new ArrayList<>(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2841,6 +2913,7 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return FileChooserModeEnumData.fromList((ArrayList) readValue(buffer)); + default: return super.readValueOfType(type, buffer); } @@ -2872,7 +2945,6 @@ public FileChooserParamsFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } - /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2895,7 +2967,19 @@ public void create( new ArrayList( Arrays.asList( instanceIdArg, isCaptureEnabledArg, acceptTypesArg, modeArg, filenameHintArg)), - channelReply -> callback.reply(null)); + channelReply -> { + callback.reply(null); + }); } } + + @NonNull + private static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList<>(3); + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + return errorList; + } } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart index d2976a86a8e..3bff7332bac 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart @@ -4,7 +4,6 @@ // Autogenerated from Pigeon (v9.0.5), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import - import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -100,6 +99,27 @@ class WebResourceRequestData { } } +class WebResourceResponseData { + WebResourceResponseData({ + required this.statusCode, + }); + + int statusCode; + + Object encode() { + return [ + statusCode, + ]; + } + + static WebResourceResponseData decode(Object result) { + result as List; + return WebResourceResponseData( + statusCode: result[0]! as int, + ); + } +} + class WebResourceErrorData { WebResourceErrorData({ required this.errorCode, @@ -334,6 +354,7 @@ class _WebViewHostApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebViewPoint.decode(readValue(buffer)!); + default: return super.readValueOfType(type, buffer); } @@ -1478,6 +1499,9 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { } else if (value is WebResourceRequestData) { buffer.putUint8(129); writeValue(buffer, value.encode()); + } else if (value is WebResourceResponseData) { + buffer.putUint8(130); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1488,8 +1512,13 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebResourceErrorData.decode(readValue(buffer)!); + case 129: return WebResourceRequestData.decode(readValue(buffer)!); + + case 130: + return WebResourceResponseData.decode(readValue(buffer)!); + default: return super.readValueOfType(type, buffer); } @@ -1503,6 +1532,9 @@ abstract class WebViewClientFlutterApi { void onPageFinished(int instanceId, int webViewInstanceId, String url); + void onReceivedHttpError(int instanceId, int webViewInstanceId, + WebResourceRequestData request, WebResourceResponseData response); + void onReceivedRequestError(int instanceId, int webViewInstanceId, WebResourceRequestData request, WebResourceErrorData error); @@ -1566,6 +1598,38 @@ abstract class WebViewClientFlutterApi { }); } } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError', + codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError was null.'); + final List args = (message as List?)!; + final int? arg_instanceId = (args[0] as int?); + assert(arg_instanceId != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError was null, expected non-null int.'); + final int? arg_webViewInstanceId = (args[1] as int?); + assert(arg_webViewInstanceId != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError was null, expected non-null int.'); + final WebResourceRequestData? arg_request = + (args[2] as WebResourceRequestData?); + assert(arg_request != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError was null, expected non-null WebResourceRequestData.'); + final WebResourceResponseData? arg_response = + (args[3] as WebResourceResponseData?); + assert(arg_response != null, + 'Argument for dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedHttpError was null, expected non-null WebResourceResponseData.'); + api.onReceivedHttpError(arg_instanceId!, arg_webViewInstanceId!, + arg_request!, arg_response!); + return; + }); + } + } { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WebViewClientFlutterApi.onReceivedRequestError', @@ -2027,6 +2091,7 @@ class _FileChooserParamsFlutterApiCodec extends StandardMessageCodec { switch (type) { case 128: return FileChooserModeEnumData.decode(readValue(buffer)!); + default: return super.readValueOfType(type, buffer); } diff --git a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart index 33ab0ecabca..d6309cfdad2 100644 --- a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart @@ -92,6 +92,7 @@ class _TestWebViewHostApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebViewPoint.decode(readValue(buffer)!); + default: return super.readValueOfType(type, buffer); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 3dcf8efa3c8..31b4b4aca7a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -21,6 +21,11 @@ * Updates minimum Flutter version to 3.3 and iOS 11. * Adds decidePolicyForNavigationResponse WKWebView delegate to support the onPageError callback. +* Aligns Dart and Flutter SDK constraints. + +## 3.2.0 + +* Updates minimum Flutter version to 3.3 and iOS 11. ## 3.1.1 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m index 957a4decd67..a391ef32fd4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m @@ -19,6 +19,10 @@ } return @[ result ?: [NSNull null] ]; } +static id GetNullableObject(NSDictionary *dict, id key) { + id result = dict[key]; + return (result == [NSNull null]) ? nil : result; +} static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { id result = array[key]; return (result == [NSNull null]) ? nil : result; From 92a3b65cfc7be07ddd9bc3ddf06406a76f11da6b Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 8 Mar 2023 17:20:51 +0100 Subject: [PATCH 13/21] Fixes build errors --- .../webview_flutter/webview_flutter/README.md | 2 +- .../webview_flutter_test.dart | 1 - .../GeneratedAndroidWebView.java | 206 +++++++++--------- .../lib/src/android_webview.g.dart | 6 +- .../webview_flutter_android/pubspec.yaml | 8 +- .../test/test_android_webview.g.dart | 1 - .../ios/Classes/FWFGeneratedWebKitApis.m | 4 - 7 files changed, 107 insertions(+), 121 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/README.md b/packages/webview_flutter/webview_flutter/README.md index 027c646ed6f..5f6538f77a3 100644 --- a/packages/webview_flutter/webview_flutter/README.md +++ b/packages/webview_flutter/webview_flutter/README.md @@ -32,7 +32,7 @@ controller = WebViewController() }, onPageStarted: (String url) {}, onPageFinished: (String url) {}, - onPageError: (int statusCode) {}, + onHttpError: (HttpResponseError error) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://www.youtube.com/')) { diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index d9dca4618dc..7763327df58 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -20,7 +20,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter_android/webview_flutter_android.dart'; -import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; Future main() async { diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java index d85e4fe6ecf..3cfa1533860 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java @@ -24,6 +24,15 @@ /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) public class GeneratedAndroidWebView { + @NonNull + private static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList(3); + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + return errorList; + } /** * Mode of how to select files for a file chooser. @@ -62,7 +71,7 @@ private FileChooserMode(final int index) { } /** Generated class from Pigeon that represents data sent in messages. */ - public static class FileChooserModeEnumData { + public static final class FileChooserModeEnumData { private @NonNull FileChooserMode value; public @NonNull FileChooserMode getValue() { @@ -80,6 +89,7 @@ public void setValue(@NonNull FileChooserMode setterArg) { private FileChooserModeEnumData() {} public static final class Builder { + private @Nullable FileChooserMode value; public @NonNull Builder setValue(@NonNull FileChooserMode setterArg) { @@ -110,7 +120,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static class WebResourceRequestData { + public static final class WebResourceRequestData { private @NonNull String url; public @NonNull String getUrl() { @@ -190,6 +200,7 @@ public void setRequestHeaders(@NonNull Map setterArg) { private WebResourceRequestData() {} public static final class Builder { + private @Nullable String url; public @NonNull Builder setUrl(@NonNull String setterArg) { @@ -275,7 +286,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static class WebResourceResponseData { + public static final class WebResourceResponseData { private @NonNull Long statusCode; public @NonNull Long getStatusCode() { @@ -293,6 +304,7 @@ public void setStatusCode(@NonNull Long setterArg) { private WebResourceResponseData() {} public static final class Builder { + private @Nullable Long statusCode; public @NonNull Builder setStatusCode(@NonNull Long setterArg) { @@ -326,7 +338,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static class WebResourceErrorData { + public static final class WebResourceErrorData { private @NonNull Long errorCode; public @NonNull Long getErrorCode() { @@ -357,6 +369,7 @@ public void setDescription(@NonNull String setterArg) { private WebResourceErrorData() {} public static final class Builder { + private @Nullable Long errorCode; public @NonNull Builder setErrorCode(@NonNull Long setterArg) { @@ -401,7 +414,7 @@ ArrayList toList() { } /** Generated class from Pigeon that represents data sent in messages. */ - public static class WebViewPoint { + public static final class WebViewPoint { private @NonNull Long x; public @NonNull Long getX() { @@ -432,6 +445,7 @@ public void setY(@NonNull Long setterArg) { private WebViewPoint() {} public static final class Builder { + private @Nullable Long x; public @NonNull Builder setX(@NonNull Long setterArg) { @@ -532,6 +546,7 @@ static void setup(BinaryMessenger binaryMessenger, InstanceManagerHostApi api) { *

Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface JavaObjectHostApi { + void dispose(@NonNull Long identifier); /** The codec used by JavaObjectHostApi. */ @@ -549,7 +564,7 @@ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -585,6 +600,7 @@ public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -599,13 +615,12 @@ public void dispose(@NonNull Long identifierArg, Reply callback) { binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); channel.send( new ArrayList(Collections.singletonList(identifierArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CookieManagerHostApi { + void clearCookies(Result result); void setCookie(@NonNull String url, @NonNull String value); @@ -628,7 +643,7 @@ static void setup(BinaryMessenger binaryMessenger, CookieManagerHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { Result resultCallback = new Result() { @@ -660,7 +675,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -697,7 +712,6 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return WebViewPoint.fromList((ArrayList) readValue(buffer)); - default: return super.readValueOfType(type, buffer); } @@ -802,7 +816,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -829,7 +843,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -868,7 +882,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -909,7 +923,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -947,7 +961,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -983,7 +997,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1011,7 +1025,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1039,7 +1053,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1067,7 +1081,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1094,7 +1108,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1121,7 +1135,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1148,7 +1162,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1183,7 +1197,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1228,7 +1242,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1256,7 +1270,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1294,7 +1308,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1332,7 +1346,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1360,7 +1374,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1388,7 +1402,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1419,7 +1433,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1446,7 +1460,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1483,7 +1497,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1521,7 +1535,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1559,7 +1573,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1591,7 +1605,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1623,7 +1637,7 @@ public void error(Throwable error) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1688,6 +1702,7 @@ public void create(@NonNull Long identifierArg, Reply callback) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebSettingsHostApi { + void create(@NonNull Long instanceId, @NonNull Long webViewInstanceId); void setDomStorageEnabled(@NonNull Long instanceId, @NonNull Boolean flag); @@ -1731,7 +1746,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1766,7 +1781,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1800,7 +1815,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1834,7 +1849,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1868,7 +1883,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1902,7 +1917,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1934,7 +1949,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -1968,7 +1983,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2002,7 +2017,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2036,7 +2051,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2070,7 +2085,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2104,7 +2119,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2138,7 +2153,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2200,6 +2215,7 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface JavaScriptChannelHostApi { + void create(@NonNull Long instanceId, @NonNull String channelName); /** The codec used by JavaScriptChannelHostApi. */ @@ -2218,7 +2234,7 @@ static void setup(BinaryMessenger binaryMessenger, JavaScriptChannelHostApi api) if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2253,6 +2269,7 @@ public JavaScriptChannelFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2270,13 +2287,12 @@ public void postMessage( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, messageArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebViewClientHostApi { + void create(@NonNull Long instanceId); void setSynchronousReturnValueForShouldOverrideUrlLoading( @@ -2298,7 +2314,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2327,7 +2343,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2365,13 +2381,10 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return WebResourceErrorData.fromList((ArrayList) readValue(buffer)); - case (byte) 129: return WebResourceRequestData.fromList((ArrayList) readValue(buffer)); - case (byte) 130: return WebResourceResponseData.fromList((ArrayList) readValue(buffer)); - default: return super.readValueOfType(type, buffer); } @@ -2402,6 +2415,7 @@ public WebViewClientFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2422,9 +2436,7 @@ public void onPageStarted( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void onPageFinished( @@ -2439,9 +2451,7 @@ public void onPageFinished( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void onReceivedHttpError( @@ -2458,9 +2468,7 @@ public void onReceivedHttpError( channel.send( new ArrayList( Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg, responseArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void onReceivedRequestError( @@ -2477,9 +2485,7 @@ public void onReceivedRequestError( channel.send( new ArrayList( Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg, errorArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void onReceivedError( @@ -2502,9 +2508,7 @@ public void onReceivedError( errorCodeArg, descriptionArg, failingUrlArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void requestLoading( @@ -2519,9 +2523,7 @@ public void requestLoading( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, requestArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void urlLoading( @@ -2534,13 +2536,12 @@ public void urlLoading( binaryMessenger, "dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading", getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, urlArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface DownloadListenerHostApi { + void create(@NonNull Long instanceId); /** The codec used by DownloadListenerHostApi. */ @@ -2559,7 +2560,7 @@ static void setup(BinaryMessenger binaryMessenger, DownloadListenerHostApi api) if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2589,6 +2590,7 @@ public DownloadListenerFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2619,13 +2621,12 @@ public void onDownloadStart( contentDispositionArg, mimetypeArg, contentLengthArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebChromeClientHostApi { + void create(@NonNull Long instanceId); void setSynchronousReturnValueForOnShowFileChooser( @@ -2647,7 +2648,7 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2676,7 +2677,7 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2705,6 +2706,7 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface FlutterAssetManagerHostApi { + @NonNull List list(@NonNull String path); @@ -2727,7 +2729,7 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2756,7 +2758,7 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2786,6 +2788,7 @@ public WebChromeClientFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2806,9 +2809,7 @@ public void onProgressChanged( getCodec()); channel.send( new ArrayList(Arrays.asList(instanceIdArg, webViewInstanceIdArg, progressArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } public void onShowFileChooser( @@ -2833,6 +2834,7 @@ public void onShowFileChooser( } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface WebStorageHostApi { + void create(@NonNull Long instanceId); void deleteAllData(@NonNull Long instanceId); @@ -2852,7 +2854,7 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2879,7 +2881,7 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { if (api != null) { channel.setMessageHandler( (message, reply) -> { - ArrayList wrapped = new ArrayList<>(); + ArrayList wrapped = new ArrayList(); try { ArrayList args = (ArrayList) message; assert args != null; @@ -2913,7 +2915,6 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { switch (type) { case (byte) 128: return FileChooserModeEnumData.fromList((ArrayList) readValue(buffer)); - default: return super.readValueOfType(type, buffer); } @@ -2945,6 +2946,7 @@ public FileChooserParamsFlutterApi(BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } + /** Public interface for sending reply. */ public interface Reply { void reply(T reply); } @@ -2967,19 +2969,7 @@ public void create( new ArrayList( Arrays.asList( instanceIdArg, isCaptureEnabledArg, acceptTypesArg, modeArg, filenameHintArg)), - channelReply -> { - callback.reply(null); - }); + channelReply -> callback.reply(null)); } } - - @NonNull - private static ArrayList wrapError(@NonNull Throwable exception) { - ArrayList errorList = new ArrayList<>(3); - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); - return errorList; - } } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart index 3bff7332bac..557726a797e 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart @@ -4,6 +4,7 @@ // Autogenerated from Pigeon (v9.0.5), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import + import 'dart:async'; import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; @@ -354,7 +355,6 @@ class _WebViewHostApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebViewPoint.decode(readValue(buffer)!); - default: return super.readValueOfType(type, buffer); } @@ -1512,13 +1512,10 @@ class _WebViewClientFlutterApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebResourceErrorData.decode(readValue(buffer)!); - case 129: return WebResourceRequestData.decode(readValue(buffer)!); - case 130: return WebResourceResponseData.decode(readValue(buffer)!); - default: return super.readValueOfType(type, buffer); } @@ -2091,7 +2088,6 @@ class _FileChooserParamsFlutterApiCodec extends StandardMessageCodec { switch (type) { case 128: return FileChooserModeEnumData.decode(readValue(buffer)!); - default: return super.readValueOfType(type, buffer); } diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 37b38268374..6e452dfe0d4 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -29,4 +29,10 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.0 - pigeon: ^9.0.4 + pigeon: ^9.0.5 + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_platform_interface: + path: ../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart index d6309cfdad2..33ab0ecabca 100644 --- a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart @@ -92,7 +92,6 @@ class _TestWebViewHostApiCodec extends StandardMessageCodec { switch (type) { case 128: return WebViewPoint.decode(readValue(buffer)!); - default: return super.readValueOfType(type, buffer); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m index a391ef32fd4..957a4decd67 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m @@ -19,10 +19,6 @@ } return @[ result ?: [NSNull null] ]; } -static id GetNullableObject(NSDictionary *dict, id key) { - id result = dict[key]; - return (result == [NSNull null]) ? nil : result; -} static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { id result = array[key]; return (result == [NSNull null]) ? nil : result; From daa484e87ffbbc24af86421b20c7a329f34cd870 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 8 Mar 2023 17:57:04 +0100 Subject: [PATCH 14/21] Fixes changelogs --- .../webview_flutter_android/CHANGELOG.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index f16ce45320b..bd6689b2230 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -23,17 +23,6 @@ ## 3.4.1 * Adds onReceivedHttpError WebView callback to support the onPageError callback. -## 3.4.0 - -* Adds support to set text zoom of a page. See `AndroidWebViewController.setTextZoom`. -* Aligns Dart and Flutter SDK constraints. - -## 3.3.2 - -* Resolves compilations warnings. -* Updates compileSdkVersion to 33. -* Bumps androidx.webkit:webkit from 1.5.0 to 1.6.0. - ## 3.4.1 * Fixes a potential bug where a `WebView` that was not added to the `InstanceManager` could be From 4706214e6ae39e8fe8046fcd6b7ef3488fb6c70e Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 30 Mar 2023 11:24:36 +0200 Subject: [PATCH 15/21] Adds integration tests --- .../webview_flutter_test.dart | 44 ++++++++++++ .../webview_flutter_android/CHANGELOG.md | 4 +- .../WebViewClientFlutterApiImpl.java | 5 +- .../webview_flutter_test.dart | 67 +++++++++++++++++ .../lib/src/android_webview_controller.dart | 3 +- .../webview_flutter_wkwebview/CHANGELOG.md | 3 +- .../webview_flutter_test.dart | 72 +++++++++++++++++++ .../lib/src/web_kit/web_kit.dart | 2 +- 8 files changed, 191 insertions(+), 9 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 7763327df58..a74ecaace75 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -646,6 +646,50 @@ Future main() async { await pageFinishCompleter.future; }); + testWidgets('onHttpError', (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + + final WebViewController controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate(onHttpError: (HttpResponseError error) { + errorCompleter.complete(error); + })) + ..loadRequest(Uri.parse('$prefixUrl/favicon.ico'),); + + await tester.pumpWidget(WebViewWidget(controller: controller)); + + final HttpResponseError error = await errorCompleter.future; + + expect(error, isNotNull); + expect(error.statusCode, 404); + }); + + testWidgets('onHttpError is not called when no HTTP error is received', + (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + final Completer pageFinishCompleter = Completer(); + + final WebViewController controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (_) => pageFinishCompleter.complete(), + onHttpError: (HttpResponseError error) { + errorCompleter.complete(error); + }, + )) + ..loadRequest( + Uri.parse('https://www.google.com'), + ); + + await tester.pumpWidget(WebViewWidget(controller: controller)); + + expect(errorCompleter.future, doesNotComplete); + await pageFinishCompleter.future; + }); + testWidgets('can block requests', (WidgetTester tester) async { Completer pageLoaded = Completer(); diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index bd6689b2230..5583ff389da 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -15,14 +15,12 @@ ## 3.4.3 * Updates internal Java InstanceManager to be cleared on hot restart. +* Adds onReceivedHttpError WebViewClient callback to support the onHttpError callback. ## 3.4.2 * Clarifies explanation of endorsement in README. -## 3.4.1 -* Adds onReceivedHttpError WebView callback to support the onPageError callback. - ## 3.4.1 * Fixes a potential bug where a `WebView` that was not added to the `InstanceManager` could be diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java index 096a750d5ec..d293dbc2557 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientFlutterApiImpl.java @@ -118,10 +118,9 @@ public void onReceivedHttpError( WebResourceRequest request, WebResourceResponse response, Reply callback) { + webViewFlutterApi.create(webView, reply -> {}); + final Long webViewIdentifier = instanceManager.getIdentifierForStrongReference(webView); - if (webViewIdentifier == null) { - throw new IllegalStateException("Could not find identifier for WebView."); - } onReceivedHttpError( getIdentifierForClient(webViewClient), webViewIdentifier, diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index 4ec7ae829e6..b6d395df815 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -859,6 +859,73 @@ Future main() async { await pageFinishCompleter.future; }); + testWidgets('onHttpError', (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + + final PlatformWebViewController controller = PlatformWebViewController( + const PlatformWebViewControllerCreationParams(), + ) + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setPlatformNavigationDelegate( + PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + )..setOnHttpError((HttpResponseError error) { + errorCompleter.complete(error); + }), + ) + ..loadRequest( + LoadRequestParams(uri: Uri.parse('$prefixUrl/favicon.ico')), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) { + return PlatformWebViewWidget( + PlatformWebViewWidgetCreationParams(controller: controller), + ).build(context); + }, + )); + + final HttpResponseError error = await errorCompleter.future; + + expect(error, isNotNull); + expect(error.statusCode, 404); + }); + + testWidgets('onHttpError is not called when no HTTP error is received', (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + final Completer pageFinishCompleter = Completer(); + + final PlatformWebViewController controller = PlatformWebViewController( + const PlatformWebViewControllerCreationParams(), + ) + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setPlatformNavigationDelegate( + PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ) + ..setOnPageFinished((_) => pageFinishCompleter.complete()) + ..setOnHttpError((HttpResponseError error) { + errorCompleter.complete(error); + }), + ) + ..loadRequest( + LoadRequestParams(uri: Uri.parse('https://www.google.com')), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) { + return PlatformWebViewWidget( + PlatformWebViewWidgetCreationParams(controller: controller), + ).build(context); + }, + )); + + expect(errorCompleter.future, doesNotComplete); + await pageFinishCompleter.future; + }); + testWidgets('can block requests', (WidgetTester tester) async { Completer pageLoaded = Completer(); diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index 4ed7e2c6ec4..6337a3ba800 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -672,7 +672,8 @@ class AndroidWebResourceError extends WebResourceError { } } -/// Error returned in `WebView.onWebResourceError` when a web resource loading error has occurred. +/// Error returned in `AndroidNavigationDelegate.setOnHttpError` when an HTTP +/// response error has been received. @immutable class AndroidHttpResponseError extends HttpResponseError { /// Creates a new [AndroidHttpResponseError]. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 31b4b4aca7a..2038ba99226 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -7,6 +7,8 @@ ## 3.2.3 * Updates to `pigeon` version 7. +* Adds `decidePolicyForNavigationResponse` to internal WKNavigationDelegate to support the + `onHttpError` callback. ## 3.2.2 @@ -20,7 +22,6 @@ ## 3.2.0 * Updates minimum Flutter version to 3.3 and iOS 11. -* Adds decidePolicyForNavigationResponse WKWebView delegate to support the onPageError callback. * Aligns Dart and Flutter SDK constraints. ## 3.2.0 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index b51d7d86a8b..d135a043eab 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -919,6 +919,78 @@ Future main() async { }, ); + testWidgets('onHttpError', (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + + final PlatformWebViewController controller = PlatformWebViewController( + WebKitWebViewControllerCreationParams(), + ) + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setPlatformNavigationDelegate( + WebKitNavigationDelegate( + const WebKitNavigationDelegateCreationParams(), + )..setOnHttpError((HttpResponseError error) { + errorCompleter.complete(error); + }), + ) + ..loadRequest( + LoadRequestParams(uri: Uri.parse('$prefixUrl/favicon.ico')), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) { + return PlatformWebViewWidget( + PlatformWebViewWidgetCreationParams(controller: controller), + ).build(context); + }, + )); + + final HttpResponseError error = await errorCompleter.future; + + expect(error, isNotNull); + expect(error.statusCode, 404); + }); + + testWidgets('onHttpError is not called when no HTTP error is received', + (WidgetTester tester) async { + final Completer errorCompleter = + Completer(); + final Completer pageFinishCompleter = Completer(); + + final PlatformWebViewController controller = PlatformWebViewController( + WebKitWebViewControllerCreationParams(), + ) + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setPlatformNavigationDelegate( + WebKitNavigationDelegate( + const WebKitNavigationDelegateCreationParams(), + ) + ..setOnPageFinished((_) => pageFinishCompleter.complete()) + ..setOnHttpError((HttpResponseError error) { + errorCompleter.complete(error); + }), + ) + ..loadRequest( + LoadRequestParams( + uri: Uri.parse( + 'https://www.google.nl', + ), + ), + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) { + return PlatformWebViewWidget( + PlatformWebViewWidgetCreationParams(controller: controller), + ).build(context); + }, + )); + + expect(errorCompleter.future, doesNotComplete); + await pageFinishCompleter.future; + }); + testWidgets('can block requests', (WidgetTester tester) async { Completer pageLoaded = Completer(); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart index 5304960bd9a..5879d337468 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart @@ -177,7 +177,7 @@ class WKNavigationAction { final WKNavigationType navigationType; } -/// An object that contains information about the http error. +/// An object that contains information about a response to a navigation request,. /// /// Wraps [WKNavigationResponse](https://developer.apple.com/documentation/webkit/wknavigationresponse?language=objc). @immutable From 74e4f96684026ed1bad5c8e2e0aa3146e6e3ddff Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 30 Mar 2023 14:11:12 +0200 Subject: [PATCH 16/21] Fixes build --- .../webview_flutter_test.dart | 4 +- .../webview_flutter_android/CHANGELOG.md | 2 +- .../webview_flutter_test.dart | 7 +- .../lib/src/android_proxy.dart | 15 +- .../lib/src/android_webview_controller.dart | 6 +- .../src/legacy/webview_android_widget.dart | 18 +- .../test/android_webview_controller_test.dart | 21 +- ...android_webview_controller_test.mocks.dart | 112 +++++--- .../webview_android_widget_test.mocks.dart | 18 +- .../CHANGELOG.md | 1 - .../webview_flutter_wkwebview/CHANGELOG.md | 4 +- .../ios/Classes/FWFGeneratedWebKitApis.h | 52 +++- .../ios/Classes/FWFGeneratedWebKitApis.m | 258 +++++++++++++---- .../lib/src/common/web_kit.g.dart | 259 ++++++++++++++---- .../src/legacy/web_kit_webview_widget.dart | 12 +- .../lib/src/webkit_proxy.dart | 9 +- .../webview_flutter_wkwebview/pubspec.yaml | 8 +- .../legacy/web_kit_webview_widget_test.dart | 6 +- .../web_kit_webview_widget_test.mocks.dart | 24 +- .../test/src/common/test_web_kit.g.dart | 57 ++-- .../test/webkit_webview_controller_test.dart | 27 +- .../test/webkit_webview_widget_test.dart | 3 +- 22 files changed, 697 insertions(+), 226 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index a74ecaace75..4a56d2e7667 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -656,7 +656,9 @@ Future main() async { NavigationDelegate(onHttpError: (HttpResponseError error) { errorCompleter.complete(error); })) - ..loadRequest(Uri.parse('$prefixUrl/favicon.ico'),); + ..loadRequest( + Uri.parse('$prefixUrl/favicon.ico'), + ); await tester.pumpWidget(WebViewWidget(controller: controller)); diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 5583ff389da..b9df045a6af 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -11,11 +11,11 @@ * Fixes a bug where the native `WebView` wouldn't be traversed for autofill automatically. * Updates minimum Flutter version to 3.3. +* Adds onReceivedHttpError WebViewClient callback to support the onHttpError callback. ## 3.4.3 * Updates internal Java InstanceManager to be cleared on hot restart. -* Adds onReceivedHttpError WebViewClient callback to support the onHttpError callback. ## 3.4.2 diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index b6d395df815..15ffd703ee1 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -892,7 +892,8 @@ Future main() async { expect(error.statusCode, 404); }); - testWidgets('onHttpError is not called when no HTTP error is received', (WidgetTester tester) async { + testWidgets('onHttpError is not called when no HTTP error is received', + (WidgetTester tester) async { final Completer errorCompleter = Completer(); final Completer pageFinishCompleter = Completer(); @@ -905,8 +906,8 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), ) - ..setOnPageFinished((_) => pageFinishCompleter.complete()) - ..setOnHttpError((HttpResponseError error) { + ..setOnPageFinished((_) => pageFinishCompleter.complete()) + ..setOnHttpError((HttpResponseError error) { errorCompleter.complete(error); }), ) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart index e099b5bd9c3..1169bb69547 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart @@ -34,7 +34,8 @@ class AndroidWebViewProxy { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? onShowFileChooser, + )? + onShowFileChooser, }) createAndroidWebChromeClient; /// Constructs a [android_webview.WebViewClient]. @@ -51,18 +52,21 @@ class AndroidWebViewProxy { android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? onReceivedRequestError, + )? + onReceivedRequestError, @Deprecated('Only called on Android version < 23.') void Function( android_webview.WebView webView, int errorCode, String description, String failingUrl, - )? onReceivedError, + )? + onReceivedError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, - )? requestLoading, + )? + requestLoading, void Function(android_webview.WebView webView, String url)? urlLoading, }) createAndroidWebViewClient; @@ -84,7 +88,8 @@ class AndroidWebViewProxy { String contentDisposition, String mimetype, int contentLength, - ) onDownloadStart, + ) + onDownloadStart, }) createDownloadListener; /// Enables debugging of web contents (HTML / CSS / JavaScript) loaded into any WebViews of this application. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index 6337a3ba800..558d2b33f3f 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -44,8 +44,7 @@ class AndroidWebViewControllerCreationParams PlatformWebViewControllerCreationParams params, { @visibleForTesting AndroidWebViewProxy androidWebViewProxy = const AndroidWebViewProxy(), - @visibleForTesting - android_webview.WebStorage? androidWebStorage, + @visibleForTesting android_webview.WebStorage? androidWebStorage, }) { return AndroidWebViewControllerCreationParams( androidWebViewProxy: androidWebViewProxy, @@ -490,8 +489,7 @@ class AndroidWebViewWidgetCreationParams super.layoutDirection, super.gestureRecognizers, this.displayWithHybridComposition = false, - @visibleForTesting - InstanceManager? instanceManager, + @visibleForTesting InstanceManager? instanceManager, @visibleForTesting this.platformViewsServiceProxy = const PlatformViewsServiceProxy(), }) : instanceManager = diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart b/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart index 8ae5ab0cece..d1f5b9de873 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart @@ -22,12 +22,10 @@ class WebViewAndroidWidget extends StatefulWidget { required this.callbacksHandler, required this.javascriptChannelRegistry, required this.onBuildWidget, - @visibleForTesting - this.webViewProxy = const WebViewProxy(), + @visibleForTesting this.webViewProxy = const WebViewProxy(), @visibleForTesting this.flutterAssetManager = const android_webview.FlutterAssetManager(), - @visibleForTesting - this.webStorage, + @visibleForTesting this.webStorage, }); /// Initial parameters used to setup the WebView. @@ -89,12 +87,10 @@ class WebViewAndroidPlatformController extends WebViewPlatformController { required CreationParams creationParams, required this.callbacksHandler, required this.javascriptChannelRegistry, - @visibleForTesting - this.webViewProxy = const WebViewProxy(), + @visibleForTesting this.webViewProxy = const WebViewProxy(), @visibleForTesting this.flutterAssetManager = const android_webview.FlutterAssetManager(), - @visibleForTesting - android_webview.WebStorage? webStorage, + @visibleForTesting android_webview.WebStorage? webStorage, }) : webStorage = webStorage ?? android_webview.WebStorage.instance, assert(creationParams.webSettings?.hasNavigationDelegate != null), super(callbacksHandler) { @@ -628,13 +624,15 @@ class WebViewProxy { android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( android_webview.WebView webView, int errorCode, String description, String failingUrl, - )? onReceivedError, + )? + onReceivedError, void Function(android_webview.WebView webView, android_webview.WebResourceRequest request)? requestLoading, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index cda0301b0a0..5b7ce37db0d 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -57,8 +57,10 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? onShowFileChooser, - })? createWebChromeClient, + )? + onShowFileChooser, + })? + createWebChromeClient, android_webview.WebView? mockWebView, android_webview.WebViewClient? mockWebViewClient, android_webview.WebStorage? mockWebStorage, @@ -78,7 +80,8 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? onShowFileChooser, + )? + onShowFileChooser, }) => MockWebChromeClient(), createAndroidWebView: () => nonNullMockWebView, @@ -98,16 +101,19 @@ void main() { int errorCode, String description, String failingUrl, - )? onReceivedError, + )? + onReceivedError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, - )? requestLoading, + )? + requestLoading, void Function(android_webview.WebView webView, String url)? urlLoading, }) => @@ -568,7 +574,8 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? onShowFileChooser, + )? + onShowFileChooser, }) { onShowFileChooserCallback = onShowFileChooser!; return mockWebChromeClient; diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index 97a1e35a9bf..c7f5e933175 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -720,22 +720,26 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? onProgressChanged, + )? + onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? onShowFileChooser, + )? + onShowFileChooser, }) get createAndroidWebChromeClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebChromeClient), returnValue: ({ void Function( _i2.WebView, int, - )? onProgressChanged, + )? + onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? onShowFileChooser, + )? + onShowFileChooser, }) => _FakeWebChromeClient_0( this, @@ -745,11 +749,13 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? onProgressChanged, + )? + onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? onShowFileChooser, + )? + onShowFileChooser, }) => _FakeWebChromeClient_0( this, @@ -759,28 +765,33 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? onProgressChanged, + )? + onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? onShowFileChooser, + )? + onShowFileChooser, })); @override _i2.WebViewClient Function({ void Function( _i2.WebView, String, - )? onPageFinished, + )? + onPageFinished, void Function( _i2.WebView, String, - )? onPageStarted, + )? + onPageStarted, void Function( _i2.WebView, int, String, String, - )? onReceivedError, + )? + onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -791,32 +802,38 @@ class MockAndroidWebViewProxy extends _i1.Mock _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? requestLoading, + )? + requestLoading, void Function( _i2.WebView, String, - )? urlLoading, + )? + urlLoading, }) get createAndroidWebViewClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebViewClient), returnValue: ({ void Function( _i2.WebView, String, - )? onPageFinished, + )? + onPageFinished, void Function( _i2.WebView, String, - )? onPageStarted, + )? + onPageStarted, void Function( _i2.WebView, int, String, String, - )? onReceivedError, + )? + onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -827,15 +844,18 @@ class MockAndroidWebViewProxy extends _i1.Mock _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? requestLoading, + )? + requestLoading, void Function( _i2.WebView, String, - )? urlLoading, + )? + urlLoading, }) => _FakeWebViewClient_1( this, @@ -845,17 +865,20 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, String, - )? onPageFinished, + )? + onPageFinished, void Function( _i2.WebView, String, - )? onPageStarted, + )? + onPageStarted, void Function( _i2.WebView, int, String, String, - )? onReceivedError, + )? + onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -866,15 +889,18 @@ class MockAndroidWebViewProxy extends _i1.Mock _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? requestLoading, + )? + requestLoading, void Function( _i2.WebView, String, - )? urlLoading, + )? + urlLoading, }) => _FakeWebViewClient_1( this, @@ -884,17 +910,20 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, String, - )? onPageFinished, + )? + onPageFinished, void Function( _i2.WebView, String, - )? onPageStarted, + )? + onPageStarted, void Function( _i2.WebView, int, String, String, - )? onReceivedError, + )? + onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, @@ -905,15 +934,18 @@ class MockAndroidWebViewProxy extends _i1.Mock _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? requestLoading, + )? + requestLoading, void Function( _i2.WebView, String, - )? urlLoading, + )? + urlLoading, })); @override _i2.FlutterAssetManager Function() get createFlutterAssetManager => @@ -962,7 +994,8 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) onDownloadStart}) get createDownloadListener => (super.noSuchMethod( + ) + onDownloadStart}) get createDownloadListener => (super.noSuchMethod( Invocation.getter(#createDownloadListener), returnValue: ( {required void Function( @@ -971,7 +1004,8 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) onDownloadStart}) => + ) + onDownloadStart}) => _FakeDownloadListener_2( this, Invocation.getter(#createDownloadListener), @@ -983,7 +1017,8 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) onDownloadStart}) => + ) + onDownloadStart}) => _FakeDownloadListener_2( this, Invocation.getter(#createDownloadListener), @@ -995,7 +1030,8 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) onDownloadStart})); + ) + onDownloadStart})); @override _i9.Future setWebContentsDebuggingEnabled(bool? enabled) => (super.noSuchMethod( @@ -1068,8 +1104,8 @@ class MockAndroidWebViewWidgetCreationParams extends _i1.Mock (super.noSuchMethod( Invocation.getter(#gestureRecognizers), returnValue: <_i11.Factory<_i12.OneSequenceGestureRecognizer>>{}, - returnValueForMissingStub: <_i11 - .Factory<_i12.OneSequenceGestureRecognizer>>{}, + returnValueForMissingStub: < + _i11.Factory<_i12.OneSequenceGestureRecognizer>>{}, ) as Set<_i11.Factory<_i12.OneSequenceGestureRecognizer>>); } diff --git a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart index b82f8dea91e..dc190e5411d 100644 --- a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart @@ -954,30 +954,36 @@ class MockWebViewProxy extends _i1.Mock implements _i7.WebViewProxy { void Function( _i2.WebView, String, - )? onPageStarted, + )? + onPageStarted, void Function( _i2.WebView, String, - )? onPageFinished, + )? + onPageFinished, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? onReceivedRequestError, + )? + onReceivedRequestError, void Function( _i2.WebView, int, String, String, - )? onReceivedError, + )? + onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? requestLoading, + )? + requestLoading, void Function( _i2.WebView, String, - )? urlLoading, + )? + urlLoading, }) => (super.noSuchMethod( Invocation.method( diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index d94dd8e9549..0d90e0c2f50 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -9,7 +9,6 @@ * Adds support to track url changes. See `PlatformNavigationDelegate.setOnUrlChange`. * Aligns Dart and Flutter SDK constraints. -* Adds platform interface for onPageError callback ## 2.0.2 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 2038ba99226..8ffd86e958c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -3,12 +3,12 @@ * Updates pigeon to fix warnings with clang 15. * Updates minimum Flutter version to 3.3. * Fixes common typos in tests and documentation. +* Adds `decidePolicyForNavigationResponse` to internal WKNavigationDelegate to support the + `onHttpError` callback. ## 3.2.3 * Updates to `pigeon` version 7. -* Adds `decidePolicyForNavigationResponse` to internal WKNavigationDelegate to support the - `onHttpError` callback. ## 3.2.2 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h index 0ebb4022234..ad5cfc36303 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h @@ -87,6 +87,14 @@ typedef NS_ENUM(NSUInteger, FWFWKNavigationActionPolicyEnum) { FWFWKNavigationActionPolicyEnumCancel = 1, }; +/// Mirror of WKNavigationResponsePolicy. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationactionpolicy?language=objc. +typedef NS_ENUM(NSUInteger, FWFWKNavigationResponsePolicyEnum) { + FWFWKNavigationResponsePolicyEnumAllow = 0, + FWFWKNavigationResponsePolicyEnumCancel = 1, +}; + /// Mirror of NSHTTPCookiePropertyKey. /// /// See https://developer.apple.com/documentation/foundation/nshttpcookiepropertykey. @@ -151,10 +159,13 @@ typedef NS_ENUM(NSUInteger, FWFWKNavigationType) { @class FWFWKAudiovisualMediaTypeEnumData; @class FWFWKWebsiteDataTypeEnumData; @class FWFWKNavigationActionPolicyEnumData; +@class FWFWKNavigationResponsePolicyEnumData; @class FWFNSHttpCookiePropertyKeyEnumData; @class FWFNSUrlRequestData; +@class FWFNSHttpUrlResponseData; @class FWFWKUserScriptData; @class FWFWKNavigationActionData; +@class FWFWKNavigationResponseData; @class FWFWKFrameInfoData; @class FWFNSErrorData; @class FWFWKScriptMessageData; @@ -202,6 +213,13 @@ typedef NS_ENUM(NSUInteger, FWFWKNavigationType) { @property(nonatomic, assign) FWFWKNavigationActionPolicyEnum value; @end +@interface FWFWKNavigationResponsePolicyEnumData : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithValue:(FWFWKNavigationResponsePolicyEnum)value; +@property(nonatomic, assign) FWFWKNavigationResponsePolicyEnum value; +@end + @interface FWFNSHttpCookiePropertyKeyEnumData : NSObject /// `init` unavailable to enforce nonnull fields, see the `make` class method. - (instancetype)init NS_UNAVAILABLE; @@ -225,6 +243,16 @@ typedef NS_ENUM(NSUInteger, FWFWKNavigationType) { @property(nonatomic, strong) NSDictionary *allHttpHeaderFields; @end +/// Mirror of NSURLResponse. +/// +/// See https://developer.apple.com/documentation/foundation/nshttpurlresponse?language=objc. +@interface FWFNSHttpUrlResponseData : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithStatusCode:(NSNumber *)statusCode; +@property(nonatomic, strong) NSNumber *statusCode; +@end + /// Mirror of WKUserScript. /// /// See https://developer.apple.com/documentation/webkit/wkuserscript?language=objc. @@ -253,6 +281,18 @@ typedef NS_ENUM(NSUInteger, FWFWKNavigationType) { @property(nonatomic, assign) FWFWKNavigationType navigationType; @end +/// Mirror of WKNavigationResponse. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationresponse. +@interface FWFWKNavigationResponseData : NSObject +/// `init` unavailable to enforce nonnull fields, see the `make` class method. +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)makeWithResponse:(FWFNSHttpUrlResponseData *)response + forMainFrame:(NSNumber *)forMainFrame; +@property(nonatomic, strong) FWFNSHttpUrlResponseData *response; +@property(nonatomic, strong) NSNumber *forMainFrame; +@end + /// Mirror of WKFrameInfo. /// /// See https://developer.apple.com/documentation/webkit/wkframeinfo?language=objc. @@ -530,7 +570,17 @@ NSObject *FWFWKNavigationDelegateFlutterApiGetCodec(void); completion: (void (^)(FWFWKNavigationActionPolicyEnumData *_Nullable, - FlutterError *_Nullable))completion; + NSError *_Nullable))completion; +- (void) + decidePolicyForNavigationResponseForDelegateWithIdentifier:(NSNumber *)identifier + webViewIdentifier:(NSNumber *)webViewIdentifier + navigationResponse: + (FWFWKNavigationResponseData *)navigationResponse + completion: + (void (^)( + FWFWKNavigationResponsePolicyEnumData + *_Nullable, + NSError *_Nullable))completion; - (void)didFailNavigationForDelegateWithIdentifier:(NSNumber *)identifier webViewIdentifier:(NSNumber *)webViewIdentifier error:(FWFNSErrorData *)error diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m index 957a4decd67..769f01c62fc 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m @@ -60,6 +60,12 @@ + (nullable FWFWKNavigationActionPolicyEnumData *)nullableFromList:(NSArray *)li - (NSArray *)toList; @end +@interface FWFWKNavigationResponsePolicyEnumData () ++ (FWFWKNavigationResponsePolicyEnumData *)fromList:(NSArray *)list; ++ (nullable FWFWKNavigationResponsePolicyEnumData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + @interface FWFNSHttpCookiePropertyKeyEnumData () + (FWFNSHttpCookiePropertyKeyEnumData *)fromList:(NSArray *)list; + (nullable FWFNSHttpCookiePropertyKeyEnumData *)nullableFromList:(NSArray *)list; @@ -72,6 +78,12 @@ + (nullable FWFNSUrlRequestData *)nullableFromList:(NSArray *)list; - (NSArray *)toList; @end +@interface FWFNSHttpUrlResponseData () ++ (FWFNSHttpUrlResponseData *)fromList:(NSArray *)list; ++ (nullable FWFNSHttpUrlResponseData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + @interface FWFWKUserScriptData () + (FWFWKUserScriptData *)fromList:(NSArray *)list; + (nullable FWFWKUserScriptData *)nullableFromList:(NSArray *)list; @@ -84,6 +96,12 @@ + (nullable FWFWKNavigationActionData *)nullableFromList:(NSArray *)list; - (NSArray *)toList; @end +@interface FWFWKNavigationResponseData () ++ (FWFWKNavigationResponseData *)fromList:(NSArray *)list; ++ (nullable FWFWKNavigationResponseData *)nullableFromList:(NSArray *)list; +- (NSArray *)toList; +@end + @interface FWFWKFrameInfoData () + (FWFWKFrameInfoData *)fromList:(NSArray *)list; + (nullable FWFWKFrameInfoData *)nullableFromList:(NSArray *)list; @@ -242,6 +260,29 @@ - (NSArray *)toList { } @end +@implementation FWFWKNavigationResponsePolicyEnumData ++ (instancetype)makeWithValue:(FWFWKNavigationResponsePolicyEnum)value { + FWFWKNavigationResponsePolicyEnumData *pigeonResult = + [[FWFWKNavigationResponsePolicyEnumData alloc] init]; + pigeonResult.value = value; + return pigeonResult; +} ++ (FWFWKNavigationResponsePolicyEnumData *)fromList:(NSArray *)list { + FWFWKNavigationResponsePolicyEnumData *pigeonResult = + [[FWFWKNavigationResponsePolicyEnumData alloc] init]; + pigeonResult.value = [GetNullableObjectAtIndex(list, 0) integerValue]; + return pigeonResult; +} ++ (nullable FWFWKNavigationResponsePolicyEnumData *)nullableFromList:(NSArray *)list { + return (list) ? [FWFWKNavigationResponsePolicyEnumData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + @(self.value), + ]; +} +@end + @implementation FWFNSHttpCookiePropertyKeyEnumData + (instancetype)makeWithValue:(FWFNSHttpCookiePropertyKeyEnum)value { FWFNSHttpCookiePropertyKeyEnumData *pigeonResult = @@ -300,6 +341,28 @@ - (NSArray *)toList { } @end +@implementation FWFNSHttpUrlResponseData ++ (instancetype)makeWithStatusCode:(NSNumber *)statusCode { + FWFNSHttpUrlResponseData *pigeonResult = [[FWFNSHttpUrlResponseData alloc] init]; + pigeonResult.statusCode = statusCode; + return pigeonResult; +} ++ (FWFNSHttpUrlResponseData *)fromList:(NSArray *)list { + FWFNSHttpUrlResponseData *pigeonResult = [[FWFNSHttpUrlResponseData alloc] init]; + pigeonResult.statusCode = GetNullableObjectAtIndex(list, 0); + NSAssert(pigeonResult.statusCode != nil, @""); + return pigeonResult; +} ++ (nullable FWFNSHttpUrlResponseData *)nullableFromList:(NSArray *)list { + return (list) ? [FWFNSHttpUrlResponseData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + (self.statusCode ?: [NSNull null]), + ]; +} +@end + @implementation FWFWKUserScriptData + (instancetype)makeWithSource:(NSString *)source injectionTime:(nullable FWFWKUserScriptInjectionTimeEnumData *)injectionTime @@ -364,6 +427,34 @@ - (NSArray *)toList { } @end +@implementation FWFWKNavigationResponseData ++ (instancetype)makeWithResponse:(FWFNSHttpUrlResponseData *)response + forMainFrame:(NSNumber *)forMainFrame { + FWFWKNavigationResponseData *pigeonResult = [[FWFWKNavigationResponseData alloc] init]; + pigeonResult.response = response; + pigeonResult.forMainFrame = forMainFrame; + return pigeonResult; +} ++ (FWFWKNavigationResponseData *)fromList:(NSArray *)list { + FWFWKNavigationResponseData *pigeonResult = [[FWFWKNavigationResponseData alloc] init]; + pigeonResult.response = + [FWFNSHttpUrlResponseData nullableFromList:(GetNullableObjectAtIndex(list, 0))]; + NSAssert(pigeonResult.response != nil, @""); + pigeonResult.forMainFrame = GetNullableObjectAtIndex(list, 1); + NSAssert(pigeonResult.forMainFrame != nil, @""); + return pigeonResult; +} ++ (nullable FWFWKNavigationResponseData *)nullableFromList:(NSArray *)list { + return (list) ? [FWFWKNavigationResponseData fromList:list] : nil; +} +- (NSArray *)toList { + return @[ + (self.response ? [self.response toList] : [NSNull null]), + (self.forMainFrame ?: [NSNull null]), + ]; +} +@end + @implementation FWFWKFrameInfoData + (instancetype)makeWithIsMainFrame:(NSNumber *)isMainFrame { FWFWKFrameInfoData *pigeonResult = [[FWFWKFrameInfoData alloc] init]; @@ -1359,13 +1450,19 @@ - (nullable id)readValueOfType:(UInt8)type { case 128: return [FWFNSErrorData fromList:[self readValue]]; case 129: - return [FWFNSUrlRequestData fromList:[self readValue]]; + return [FWFNSHttpUrlResponseData fromList:[self readValue]]; case 130: - return [FWFWKFrameInfoData fromList:[self readValue]]; + return [FWFNSUrlRequestData fromList:[self readValue]]; case 131: - return [FWFWKNavigationActionData fromList:[self readValue]]; + return [FWFWKFrameInfoData fromList:[self readValue]]; case 132: + return [FWFWKNavigationActionData fromList:[self readValue]]; + case 133: return [FWFWKNavigationActionPolicyEnumData fromList:[self readValue]]; + case 134: + return [FWFWKNavigationResponseData fromList:[self readValue]]; + case 135: + return [FWFWKNavigationResponsePolicyEnumData fromList:[self readValue]]; default: return [super readValueOfType:type]; } @@ -1379,18 +1476,27 @@ - (void)writeValue:(id)value { if ([value isKindOfClass:[FWFNSErrorData class]]) { [self writeByte:128]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { + } else if ([value isKindOfClass:[FWFNSHttpUrlResponseData class]]) { [self writeByte:129]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { + } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { [self writeByte:130]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { + } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { [self writeByte:131]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { [self writeByte:132]; [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { + [self writeByte:133]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKNavigationResponseData class]]) { + [self writeByte:134]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKNavigationResponsePolicyEnumData class]]) { + [self writeByte:135]; + [self writeValue:[value toList]]; } else { [super writeValue:value]; } @@ -1490,6 +1596,30 @@ - (void)decidePolicyForNavigationActionForDelegateWithIdentifier:(NSNumber *)arg completion(output, nil); }]; } +- (void) + decidePolicyForNavigationResponseForDelegateWithIdentifier:(NSNumber *)arg_identifier + webViewIdentifier:(NSNumber *)arg_webViewIdentifier + navigationResponse:(FWFWKNavigationResponseData *) + arg_navigationResponse + completion: + (void (^)( + FWFWKNavigationResponsePolicyEnumData + *_Nullable, + NSError *_Nullable))completion { + FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel + messageChannelWithName: + @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse" + binaryMessenger:self.binaryMessenger + codec:FWFWKNavigationDelegateFlutterApiGetCodec()]; + [channel sendMessage:@[ + arg_identifier ?: [NSNull null], arg_webViewIdentifier ?: [NSNull null], + arg_navigationResponse ?: [NSNull null] + ] + reply:^(id reply) { + FWFWKNavigationResponsePolicyEnumData *output = reply; + completion(output, nil); + }]; +} - (void)didFailNavigationForDelegateWithIdentifier:(NSNumber *)arg_identifier webViewIdentifier:(NSNumber *)arg_webViewIdentifier error:(FWFNSErrorData *)arg_error @@ -1686,26 +1816,32 @@ - (nullable id)readValueOfType:(UInt8)type { case 130: return [FWFNSHttpCookiePropertyKeyEnumData fromList:[self readValue]]; case 131: - return [FWFNSKeyValueChangeKeyEnumData fromList:[self readValue]]; + return [FWFNSHttpUrlResponseData fromList:[self readValue]]; case 132: - return [FWFNSKeyValueObservingOptionsEnumData fromList:[self readValue]]; + return [FWFNSKeyValueChangeKeyEnumData fromList:[self readValue]]; case 133: - return [FWFNSUrlRequestData fromList:[self readValue]]; + return [FWFNSKeyValueObservingOptionsEnumData fromList:[self readValue]]; case 134: - return [FWFWKAudiovisualMediaTypeEnumData fromList:[self readValue]]; + return [FWFNSUrlRequestData fromList:[self readValue]]; case 135: - return [FWFWKFrameInfoData fromList:[self readValue]]; + return [FWFWKAudiovisualMediaTypeEnumData fromList:[self readValue]]; case 136: - return [FWFWKNavigationActionData fromList:[self readValue]]; + return [FWFWKFrameInfoData fromList:[self readValue]]; case 137: - return [FWFWKNavigationActionPolicyEnumData fromList:[self readValue]]; + return [FWFWKNavigationActionData fromList:[self readValue]]; case 138: - return [FWFWKScriptMessageData fromList:[self readValue]]; + return [FWFWKNavigationActionPolicyEnumData fromList:[self readValue]]; case 139: - return [FWFWKUserScriptData fromList:[self readValue]]; + return [FWFWKNavigationResponseData fromList:[self readValue]]; case 140: - return [FWFWKUserScriptInjectionTimeEnumData fromList:[self readValue]]; + return [FWFWKNavigationResponsePolicyEnumData fromList:[self readValue]]; case 141: + return [FWFWKScriptMessageData fromList:[self readValue]]; + case 142: + return [FWFWKUserScriptData fromList:[self readValue]]; + case 143: + return [FWFWKUserScriptInjectionTimeEnumData fromList:[self readValue]]; + case 144: return [FWFWKWebsiteDataTypeEnumData fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -1726,39 +1862,48 @@ - (void)writeValue:(id)value { } else if ([value isKindOfClass:[FWFNSHttpCookiePropertyKeyEnumData class]]) { [self writeByte:130]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSKeyValueChangeKeyEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSHttpUrlResponseData class]]) { [self writeByte:131]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSKeyValueObservingOptionsEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSKeyValueChangeKeyEnumData class]]) { [self writeByte:132]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { + } else if ([value isKindOfClass:[FWFNSKeyValueObservingOptionsEnumData class]]) { [self writeByte:133]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKAudiovisualMediaTypeEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { [self writeByte:134]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { + } else if ([value isKindOfClass:[FWFWKAudiovisualMediaTypeEnumData class]]) { [self writeByte:135]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { + } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { [self writeByte:136]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { [self writeByte:137]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKScriptMessageData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { [self writeByte:138]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKUserScriptData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationResponseData class]]) { [self writeByte:139]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKUserScriptInjectionTimeEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationResponsePolicyEnumData class]]) { [self writeByte:140]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKWebsiteDataTypeEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKScriptMessageData class]]) { [self writeByte:141]; [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKUserScriptData class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKUserScriptInjectionTimeEnumData class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKWebsiteDataTypeEnumData class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; } else { [super writeValue:value]; } @@ -1845,26 +1990,32 @@ - (nullable id)readValueOfType:(UInt8)type { case 130: return [FWFNSHttpCookiePropertyKeyEnumData fromList:[self readValue]]; case 131: - return [FWFNSKeyValueChangeKeyEnumData fromList:[self readValue]]; + return [FWFNSHttpUrlResponseData fromList:[self readValue]]; case 132: - return [FWFNSKeyValueObservingOptionsEnumData fromList:[self readValue]]; + return [FWFNSKeyValueChangeKeyEnumData fromList:[self readValue]]; case 133: - return [FWFNSUrlRequestData fromList:[self readValue]]; + return [FWFNSKeyValueObservingOptionsEnumData fromList:[self readValue]]; case 134: - return [FWFWKAudiovisualMediaTypeEnumData fromList:[self readValue]]; + return [FWFNSUrlRequestData fromList:[self readValue]]; case 135: - return [FWFWKFrameInfoData fromList:[self readValue]]; + return [FWFWKAudiovisualMediaTypeEnumData fromList:[self readValue]]; case 136: - return [FWFWKNavigationActionData fromList:[self readValue]]; + return [FWFWKFrameInfoData fromList:[self readValue]]; case 137: - return [FWFWKNavigationActionPolicyEnumData fromList:[self readValue]]; + return [FWFWKNavigationActionData fromList:[self readValue]]; case 138: - return [FWFWKScriptMessageData fromList:[self readValue]]; + return [FWFWKNavigationActionPolicyEnumData fromList:[self readValue]]; case 139: - return [FWFWKUserScriptData fromList:[self readValue]]; + return [FWFWKNavigationResponseData fromList:[self readValue]]; case 140: - return [FWFWKUserScriptInjectionTimeEnumData fromList:[self readValue]]; + return [FWFWKNavigationResponsePolicyEnumData fromList:[self readValue]]; case 141: + return [FWFWKScriptMessageData fromList:[self readValue]]; + case 142: + return [FWFWKUserScriptData fromList:[self readValue]]; + case 143: + return [FWFWKUserScriptInjectionTimeEnumData fromList:[self readValue]]; + case 144: return [FWFWKWebsiteDataTypeEnumData fromList:[self readValue]]; default: return [super readValueOfType:type]; @@ -1885,39 +2036,48 @@ - (void)writeValue:(id)value { } else if ([value isKindOfClass:[FWFNSHttpCookiePropertyKeyEnumData class]]) { [self writeByte:130]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSKeyValueChangeKeyEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSHttpUrlResponseData class]]) { [self writeByte:131]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSKeyValueObservingOptionsEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSKeyValueChangeKeyEnumData class]]) { [self writeByte:132]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { + } else if ([value isKindOfClass:[FWFNSKeyValueObservingOptionsEnumData class]]) { [self writeByte:133]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKAudiovisualMediaTypeEnumData class]]) { + } else if ([value isKindOfClass:[FWFNSUrlRequestData class]]) { [self writeByte:134]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { + } else if ([value isKindOfClass:[FWFWKAudiovisualMediaTypeEnumData class]]) { [self writeByte:135]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { + } else if ([value isKindOfClass:[FWFWKFrameInfoData class]]) { [self writeByte:136]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationActionData class]]) { [self writeByte:137]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKScriptMessageData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationActionPolicyEnumData class]]) { [self writeByte:138]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKUserScriptData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationResponseData class]]) { [self writeByte:139]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKUserScriptInjectionTimeEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKNavigationResponsePolicyEnumData class]]) { [self writeByte:140]; [self writeValue:[value toList]]; - } else if ([value isKindOfClass:[FWFWKWebsiteDataTypeEnumData class]]) { + } else if ([value isKindOfClass:[FWFWKScriptMessageData class]]) { [self writeByte:141]; [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKUserScriptData class]]) { + [self writeByte:142]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKUserScriptInjectionTimeEnumData class]]) { + [self writeByte:143]; + [self writeValue:[value toList]]; + } else if ([value isKindOfClass:[FWFWKWebsiteDataTypeEnumData class]]) { + [self writeByte:144]; + [self writeValue:[value toList]]; } else { [super writeValue:value]; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart index 75d7aabf233..72c2e608197 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart @@ -82,6 +82,14 @@ enum WKNavigationActionPolicyEnum { cancel, } +/// Mirror of WKNavigationResponsePolicy. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationactionpolicy?language=objc. +enum WKNavigationResponsePolicyEnum { + allow, + cancel, +} + /// Mirror of NSHTTPCookiePropertyKey. /// /// See https://developer.apple.com/documentation/foundation/nshttpcookiepropertykey. @@ -264,6 +272,27 @@ class WKNavigationActionPolicyEnumData { } } +class WKNavigationResponsePolicyEnumData { + WKNavigationResponsePolicyEnumData({ + required this.value, + }); + + WKNavigationResponsePolicyEnum value; + + Object encode() { + return [ + value.index, + ]; + } + + static WKNavigationResponsePolicyEnumData decode(Object result) { + result as List; + return WKNavigationResponsePolicyEnumData( + value: WKNavigationResponsePolicyEnum.values[result[0]! as int], + ); + } +} + class NSHttpCookiePropertyKeyEnumData { NSHttpCookiePropertyKeyEnumData({ required this.value, @@ -325,6 +354,30 @@ class NSUrlRequestData { } } +/// Mirror of NSURLResponse. +/// +/// See https://developer.apple.com/documentation/foundation/nshttpurlresponse?language=objc. +class NSHttpUrlResponseData { + NSHttpUrlResponseData({ + required this.statusCode, + }); + + int statusCode; + + Object encode() { + return [ + statusCode, + ]; + } + + static NSHttpUrlResponseData decode(Object result) { + result as List; + return NSHttpUrlResponseData( + statusCode: result[0]! as int, + ); + } +} + /// Mirror of WKUserScript. /// /// See https://developer.apple.com/documentation/webkit/wkuserscript?language=objc. @@ -396,6 +449,35 @@ class WKNavigationActionData { } } +/// Mirror of WKNavigationResponse. +/// +/// See https://developer.apple.com/documentation/webkit/wknavigationresponse. +class WKNavigationResponseData { + WKNavigationResponseData({ + required this.response, + required this.forMainFrame, + }); + + NSHttpUrlResponseData response; + + bool forMainFrame; + + Object encode() { + return [ + response.encode(), + forMainFrame, + ]; + } + + static WKNavigationResponseData decode(Object result) { + result as List; + return WKNavigationResponseData( + response: NSHttpUrlResponseData.decode(result[0]! as List), + forMainFrame: result[1]! as bool, + ); + } +} + /// Mirror of WKFrameInfo. /// /// See https://developer.apple.com/documentation/webkit/wkframeinfo?language=objc. @@ -1358,18 +1440,27 @@ class _WKNavigationDelegateFlutterApiCodec extends StandardMessageCodec { if (value is NSErrorData) { buffer.putUint8(128); writeValue(buffer, value.encode()); - } else if (value is NSUrlRequestData) { + } else if (value is NSHttpUrlResponseData) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is WKFrameInfoData) { + } else if (value is NSUrlRequestData) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionData) { + } else if (value is WKFrameInfoData) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionPolicyEnumData) { + } else if (value is WKNavigationActionData) { buffer.putUint8(132); writeValue(buffer, value.encode()); + } else if (value is WKNavigationActionPolicyEnumData) { + buffer.putUint8(133); + writeValue(buffer, value.encode()); + } else if (value is WKNavigationResponseData) { + buffer.putUint8(134); + writeValue(buffer, value.encode()); + } else if (value is WKNavigationResponsePolicyEnumData) { + buffer.putUint8(135); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1381,13 +1472,19 @@ class _WKNavigationDelegateFlutterApiCodec extends StandardMessageCodec { case 128: return NSErrorData.decode(readValue(buffer)!); case 129: - return NSUrlRequestData.decode(readValue(buffer)!); + return NSHttpUrlResponseData.decode(readValue(buffer)!); case 130: - return WKFrameInfoData.decode(readValue(buffer)!); + return NSUrlRequestData.decode(readValue(buffer)!); case 131: - return WKNavigationActionData.decode(readValue(buffer)!); + return WKFrameInfoData.decode(readValue(buffer)!); case 132: + return WKNavigationActionData.decode(readValue(buffer)!); + case 133: return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); + case 134: + return WKNavigationResponseData.decode(readValue(buffer)!); + case 135: + return WKNavigationResponsePolicyEnumData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); } @@ -1411,6 +1508,11 @@ abstract class WKNavigationDelegateFlutterApi { int webViewIdentifier, WKNavigationActionData navigationAction); + Future decidePolicyForNavigationResponse( + int identifier, + int webViewIdentifier, + WKNavigationResponseData navigationResponse); + void didFailNavigation( int identifier, int webViewIdentifier, NSErrorData error); @@ -1501,6 +1603,35 @@ abstract class WKNavigationDelegateFlutterApi { }); } } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse', + codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse was null, expected non-null int.'); + final int? arg_webViewIdentifier = (args[1] as int?); + assert(arg_webViewIdentifier != null, + 'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse was null, expected non-null int.'); + final WKNavigationResponseData? arg_navigationResponse = + (args[2] as WKNavigationResponseData?); + assert(arg_navigationResponse != null, + 'Argument for dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse was null, expected non-null WKNavigationResponseData.'); + final WKNavigationResponsePolicyEnumData output = + await api.decidePolicyForNavigationResponse(arg_identifier!, + arg_webViewIdentifier!, arg_navigationResponse!); + return output; + }); + } + } { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WKNavigationDelegateFlutterApi.didFailNavigation', @@ -1708,39 +1839,48 @@ class _NSObjectFlutterApiCodec extends StandardMessageCodec { } else if (value is NSHttpCookiePropertyKeyEnumData) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueChangeKeyEnumData) { + } else if (value is NSHttpUrlResponseData) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueObservingOptionsEnumData) { + } else if (value is NSKeyValueChangeKeyEnumData) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is NSUrlRequestData) { + } else if (value is NSKeyValueObservingOptionsEnumData) { buffer.putUint8(133); writeValue(buffer, value.encode()); - } else if (value is WKAudiovisualMediaTypeEnumData) { + } else if (value is NSUrlRequestData) { buffer.putUint8(134); writeValue(buffer, value.encode()); - } else if (value is WKFrameInfoData) { + } else if (value is WKAudiovisualMediaTypeEnumData) { buffer.putUint8(135); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionData) { + } else if (value is WKFrameInfoData) { buffer.putUint8(136); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionPolicyEnumData) { + } else if (value is WKNavigationActionData) { buffer.putUint8(137); writeValue(buffer, value.encode()); - } else if (value is WKScriptMessageData) { + } else if (value is WKNavigationActionPolicyEnumData) { buffer.putUint8(138); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptData) { + } else if (value is WKNavigationResponseData) { buffer.putUint8(139); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptInjectionTimeEnumData) { + } else if (value is WKNavigationResponsePolicyEnumData) { buffer.putUint8(140); writeValue(buffer, value.encode()); - } else if (value is WKWebsiteDataTypeEnumData) { + } else if (value is WKScriptMessageData) { buffer.putUint8(141); writeValue(buffer, value.encode()); + } else if (value is WKUserScriptData) { + buffer.putUint8(142); + writeValue(buffer, value.encode()); + } else if (value is WKUserScriptInjectionTimeEnumData) { + buffer.putUint8(143); + writeValue(buffer, value.encode()); + } else if (value is WKWebsiteDataTypeEnumData) { + buffer.putUint8(144); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1756,26 +1896,32 @@ class _NSObjectFlutterApiCodec extends StandardMessageCodec { case 130: return NSHttpCookiePropertyKeyEnumData.decode(readValue(buffer)!); case 131: - return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); + return NSHttpUrlResponseData.decode(readValue(buffer)!); case 132: - return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); + return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); case 133: - return NSUrlRequestData.decode(readValue(buffer)!); + return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); case 134: - return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); + return NSUrlRequestData.decode(readValue(buffer)!); case 135: - return WKFrameInfoData.decode(readValue(buffer)!); + return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); case 136: - return WKNavigationActionData.decode(readValue(buffer)!); + return WKFrameInfoData.decode(readValue(buffer)!); case 137: - return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); + return WKNavigationActionData.decode(readValue(buffer)!); case 138: - return WKScriptMessageData.decode(readValue(buffer)!); + return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); case 139: - return WKUserScriptData.decode(readValue(buffer)!); + return WKNavigationResponseData.decode(readValue(buffer)!); case 140: - return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + return WKNavigationResponsePolicyEnumData.decode(readValue(buffer)!); case 141: + return WKScriptMessageData.decode(readValue(buffer)!); + case 142: + return WKUserScriptData.decode(readValue(buffer)!); + case 143: + return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + case 144: return WKWebsiteDataTypeEnumData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -1869,39 +2015,48 @@ class _WKWebViewHostApiCodec extends StandardMessageCodec { } else if (value is NSHttpCookiePropertyKeyEnumData) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueChangeKeyEnumData) { + } else if (value is NSHttpUrlResponseData) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueObservingOptionsEnumData) { + } else if (value is NSKeyValueChangeKeyEnumData) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is NSUrlRequestData) { + } else if (value is NSKeyValueObservingOptionsEnumData) { buffer.putUint8(133); writeValue(buffer, value.encode()); - } else if (value is WKAudiovisualMediaTypeEnumData) { + } else if (value is NSUrlRequestData) { buffer.putUint8(134); writeValue(buffer, value.encode()); - } else if (value is WKFrameInfoData) { + } else if (value is WKAudiovisualMediaTypeEnumData) { buffer.putUint8(135); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionData) { + } else if (value is WKFrameInfoData) { buffer.putUint8(136); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionPolicyEnumData) { + } else if (value is WKNavigationActionData) { buffer.putUint8(137); writeValue(buffer, value.encode()); - } else if (value is WKScriptMessageData) { + } else if (value is WKNavigationActionPolicyEnumData) { buffer.putUint8(138); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptData) { + } else if (value is WKNavigationResponseData) { buffer.putUint8(139); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptInjectionTimeEnumData) { + } else if (value is WKNavigationResponsePolicyEnumData) { buffer.putUint8(140); writeValue(buffer, value.encode()); - } else if (value is WKWebsiteDataTypeEnumData) { + } else if (value is WKScriptMessageData) { buffer.putUint8(141); writeValue(buffer, value.encode()); + } else if (value is WKUserScriptData) { + buffer.putUint8(142); + writeValue(buffer, value.encode()); + } else if (value is WKUserScriptInjectionTimeEnumData) { + buffer.putUint8(143); + writeValue(buffer, value.encode()); + } else if (value is WKWebsiteDataTypeEnumData) { + buffer.putUint8(144); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1917,26 +2072,32 @@ class _WKWebViewHostApiCodec extends StandardMessageCodec { case 130: return NSHttpCookiePropertyKeyEnumData.decode(readValue(buffer)!); case 131: - return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); + return NSHttpUrlResponseData.decode(readValue(buffer)!); case 132: - return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); + return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); case 133: - return NSUrlRequestData.decode(readValue(buffer)!); + return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); case 134: - return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); + return NSUrlRequestData.decode(readValue(buffer)!); case 135: - return WKFrameInfoData.decode(readValue(buffer)!); + return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); case 136: - return WKNavigationActionData.decode(readValue(buffer)!); + return WKFrameInfoData.decode(readValue(buffer)!); case 137: - return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); + return WKNavigationActionData.decode(readValue(buffer)!); case 138: - return WKScriptMessageData.decode(readValue(buffer)!); + return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); case 139: - return WKUserScriptData.decode(readValue(buffer)!); + return WKNavigationResponseData.decode(readValue(buffer)!); case 140: - return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + return WKNavigationResponsePolicyEnumData.decode(readValue(buffer)!); case 141: + return WKScriptMessageData.decode(readValue(buffer)!); + case 142: + return WKUserScriptData.decode(readValue(buffer)!); + case 143: + return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + case 144: return WKWebsiteDataTypeEnumData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart index 65b3a8f78f7..99826c2b9e5 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart @@ -655,7 +655,8 @@ class WebViewWidgetProxy { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, }) { return WKWebView(configuration, observeValue: observeValue); } @@ -665,7 +666,8 @@ class WebViewWidgetProxy { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) { return WKScriptMessageHandler( didReceiveScriptMessage: didReceiveScriptMessage, @@ -678,7 +680,8 @@ class WebViewWidgetProxy { WKWebView webView, WKWebViewConfiguration configuration, WKNavigationAction navigationAction, - )? onCreateWebView, + )? + onCreateWebView, }) { return WKUIDelegate(onCreateWebView: onCreateWebView); } @@ -691,7 +694,8 @@ class WebViewWidgetProxy { Future Function( WKWebView webView, WKNavigationAction navigationAction, - )? decidePolicyForNavigationAction, + )? + decidePolicyForNavigationAction, void Function(WKWebView webView, NSError error)? didFailNavigation, void Function(WKWebView webView, NSError error)? didFailProvisionalNavigation, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart index ea2f20e030e..cbd500b0a33 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart @@ -38,7 +38,8 @@ class WebKitProxy { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, InstanceManager? instanceManager, }) createWebView; @@ -52,7 +53,8 @@ class WebKitProxy { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) createScriptMessageHandler; /// The default [WKWebsiteDataStore]. @@ -85,6 +87,7 @@ class WebKitProxy { WKWebView webView, WKWebViewConfiguration configuration, WKNavigationAction navigationAction, - )? onCreateWebView, + )? + onCreateWebView, }) createUIDelegate; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 6d3286796ca..1fbb20c59b5 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -29,4 +29,10 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.0 - pigeon: ^9.2.4 + pigeon: ^7.0.5 + + +# FOR TESTING ONLY. DO NOT MERGE. +dependency_overrides: + webview_flutter_platform_interface: + path: ../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart index 9388bddd558..8a9aab8ae06 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart @@ -221,7 +221,8 @@ void main() { ); verify(mockWebViewConfiguration - .setMediaTypesRequiringUserActionForPlayback({ + .setMediaTypesRequiringUserActionForPlayback(< + WKAudiovisualMediaType>{ WKAudiovisualMediaType.all, })); }); @@ -239,7 +240,8 @@ void main() { ); verify(mockWebViewConfiguration - .setMediaTypesRequiringUserActionForPlayback({ + .setMediaTypesRequiringUserActionForPlayback(< + WKAudiovisualMediaType>{ WKAudiovisualMediaType.none, })); }); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart index 6f5ffe0b5ac..ebce82c182f 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart @@ -1174,7 +1174,8 @@ class MockWebViewWidgetProxy extends _i1.Mock String, _i7.NSObject, Map<_i7.NSKeyValueChangeKey, Object?>, - )? observeValue, + )? + observeValue, }) => (super.noSuchMethod( Invocation.method( @@ -1196,7 +1197,8 @@ class MockWebViewWidgetProxy extends _i1.Mock {required void Function( _i4.WKUserContentController, _i4.WKScriptMessage, - )? didReceiveScriptMessage}) => + )? + didReceiveScriptMessage}) => (super.noSuchMethod( Invocation.method( #createScriptMessageHandler, @@ -1218,7 +1220,8 @@ class MockWebViewWidgetProxy extends _i1.Mock _i4.WKWebView, _i4.WKWebViewConfiguration, _i4.WKNavigationAction, - )? onCreateWebView}) => + )? + onCreateWebView}) => (super.noSuchMethod( Invocation.method( #createUIDelgate, @@ -1239,23 +1242,28 @@ class MockWebViewWidgetProxy extends _i1.Mock void Function( _i4.WKWebView, String?, - )? didFinishNavigation, + )? + didFinishNavigation, void Function( _i4.WKWebView, String?, - )? didStartProvisionalNavigation, + )? + didStartProvisionalNavigation, _i5.Future<_i4.WKNavigationActionPolicy> Function( _i4.WKWebView, _i4.WKNavigationAction, - )? decidePolicyForNavigationAction, + )? + decidePolicyForNavigationAction, void Function( _i4.WKWebView, _i7.NSError, - )? didFailNavigation, + )? + didFailNavigation, void Function( _i4.WKWebView, _i7.NSError, - )? didFailProvisionalNavigation, + )? + didFailProvisionalNavigation, void Function(_i4.WKWebView)? webViewWebContentProcessDidTerminate, }) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart index ce6ecb66241..a93b098df35 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart @@ -977,39 +977,48 @@ class _TestWKWebViewHostApiCodec extends StandardMessageCodec { } else if (value is NSHttpCookiePropertyKeyEnumData) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueChangeKeyEnumData) { + } else if (value is NSHttpUrlResponseData) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is NSKeyValueObservingOptionsEnumData) { + } else if (value is NSKeyValueChangeKeyEnumData) { buffer.putUint8(132); writeValue(buffer, value.encode()); - } else if (value is NSUrlRequestData) { + } else if (value is NSKeyValueObservingOptionsEnumData) { buffer.putUint8(133); writeValue(buffer, value.encode()); - } else if (value is WKAudiovisualMediaTypeEnumData) { + } else if (value is NSUrlRequestData) { buffer.putUint8(134); writeValue(buffer, value.encode()); - } else if (value is WKFrameInfoData) { + } else if (value is WKAudiovisualMediaTypeEnumData) { buffer.putUint8(135); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionData) { + } else if (value is WKFrameInfoData) { buffer.putUint8(136); writeValue(buffer, value.encode()); - } else if (value is WKNavigationActionPolicyEnumData) { + } else if (value is WKNavigationActionData) { buffer.putUint8(137); writeValue(buffer, value.encode()); - } else if (value is WKScriptMessageData) { + } else if (value is WKNavigationActionPolicyEnumData) { buffer.putUint8(138); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptData) { + } else if (value is WKNavigationResponseData) { buffer.putUint8(139); writeValue(buffer, value.encode()); - } else if (value is WKUserScriptInjectionTimeEnumData) { + } else if (value is WKNavigationResponsePolicyEnumData) { buffer.putUint8(140); writeValue(buffer, value.encode()); - } else if (value is WKWebsiteDataTypeEnumData) { + } else if (value is WKScriptMessageData) { buffer.putUint8(141); writeValue(buffer, value.encode()); + } else if (value is WKUserScriptData) { + buffer.putUint8(142); + writeValue(buffer, value.encode()); + } else if (value is WKUserScriptInjectionTimeEnumData) { + buffer.putUint8(143); + writeValue(buffer, value.encode()); + } else if (value is WKWebsiteDataTypeEnumData) { + buffer.putUint8(144); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -1025,26 +1034,32 @@ class _TestWKWebViewHostApiCodec extends StandardMessageCodec { case 130: return NSHttpCookiePropertyKeyEnumData.decode(readValue(buffer)!); case 131: - return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); + return NSHttpUrlResponseData.decode(readValue(buffer)!); case 132: - return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); + return NSKeyValueChangeKeyEnumData.decode(readValue(buffer)!); case 133: - return NSUrlRequestData.decode(readValue(buffer)!); + return NSKeyValueObservingOptionsEnumData.decode(readValue(buffer)!); case 134: - return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); + return NSUrlRequestData.decode(readValue(buffer)!); case 135: - return WKFrameInfoData.decode(readValue(buffer)!); + return WKAudiovisualMediaTypeEnumData.decode(readValue(buffer)!); case 136: - return WKNavigationActionData.decode(readValue(buffer)!); + return WKFrameInfoData.decode(readValue(buffer)!); case 137: - return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); + return WKNavigationActionData.decode(readValue(buffer)!); case 138: - return WKScriptMessageData.decode(readValue(buffer)!); + return WKNavigationActionPolicyEnumData.decode(readValue(buffer)!); case 139: - return WKUserScriptData.decode(readValue(buffer)!); + return WKNavigationResponseData.decode(readValue(buffer)!); case 140: - return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + return WKNavigationResponsePolicyEnumData.decode(readValue(buffer)!); case 141: + return WKScriptMessageData.decode(readValue(buffer)!); + case 142: + return WKUserScriptData.decode(readValue(buffer)!); + case 143: + return WKUserScriptInjectionTimeEnumData.decode(readValue(buffer)!); + case 144: return WKWebsiteDataTypeEnumData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index 2661c1d43e9..84cdebcc436 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -45,8 +45,10 @@ void main() { String keyPath, NSObject object, Map change, - )? observeValue, - })? createMockWebView, + )? + observeValue, + })? + createMockWebView, MockWKWebViewConfiguration? mockWebViewConfiguration, InstanceManager? instanceManager, }) { @@ -66,7 +68,8 @@ void main() { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, InstanceManager? instanceManager, }) { nonNullMockWebView = createMockWebView == null @@ -658,7 +661,8 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -703,7 +707,8 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -742,7 +747,8 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -832,7 +838,8 @@ void main() { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, }) { webViewObserveValue = observeValue!; return mockWebView; @@ -893,7 +900,8 @@ void main() { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, }) { webViewObserveValue = observeValue!; return mockWebView; @@ -958,7 +966,8 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) didReceiveScriptMessage, + ) + didReceiveScriptMessage, }) { messageHandler = WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart index bc02bea0328..2a6434be4f0 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart @@ -32,7 +32,8 @@ void main() { String keyPath, NSObject object, Map change, - )? observeValue, + )? + observeValue, InstanceManager? instanceManager, }) { final WKWebView webView = WKWebView.detached( From 2ba480cb8b97b65c852f546c3a0ce6daf585026e Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 5 Apr 2023 16:39:52 +0200 Subject: [PATCH 17/21] Formats the Dart files again --- .../lib/src/android_proxy.dart | 18 +-- .../lib/src/android_webview_controller.dart | 6 +- .../src/legacy/webview_android_widget.dart | 18 +-- .../test/android_webview_controller_test.dart | 21 +-- ...android_webview_controller_test.mocks.dart | 124 ++++++------------ .../webview_android_widget_test.mocks.dart | 18 +-- .../src/legacy/web_kit_webview_widget.dart | 12 +- .../lib/src/webkit_proxy.dart | 15 +-- .../legacy/web_kit_webview_widget_test.dart | 6 +- .../web_kit_webview_widget_test.mocks.dart | 24 ++-- .../test/webkit_webview_controller_test.dart | 27 ++-- .../test/webkit_webview_widget_test.dart | 3 +- 12 files changed, 104 insertions(+), 188 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart index 1169bb69547..59e4e68b7a4 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_proxy.dart @@ -34,8 +34,7 @@ class AndroidWebViewProxy { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? - onShowFileChooser, + )? onShowFileChooser, }) createAndroidWebChromeClient; /// Constructs a [android_webview.WebViewClient]. @@ -46,27 +45,23 @@ class AndroidWebViewProxy { android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceResponse response, - )? - onReceivedHttpError, + )? onReceivedHttpError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? - onReceivedRequestError, + )? onReceivedRequestError, @Deprecated('Only called on Android version < 23.') void Function( android_webview.WebView webView, int errorCode, String description, String failingUrl, - )? - onReceivedError, + )? onReceivedError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, - )? - requestLoading, + )? requestLoading, void Function(android_webview.WebView webView, String url)? urlLoading, }) createAndroidWebViewClient; @@ -88,8 +83,7 @@ class AndroidWebViewProxy { String contentDisposition, String mimetype, int contentLength, - ) - onDownloadStart, + ) onDownloadStart, }) createDownloadListener; /// Enables debugging of web contents (HTML / CSS / JavaScript) loaded into any WebViews of this application. diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart index 558d2b33f3f..6337a3ba800 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart @@ -44,7 +44,8 @@ class AndroidWebViewControllerCreationParams PlatformWebViewControllerCreationParams params, { @visibleForTesting AndroidWebViewProxy androidWebViewProxy = const AndroidWebViewProxy(), - @visibleForTesting android_webview.WebStorage? androidWebStorage, + @visibleForTesting + android_webview.WebStorage? androidWebStorage, }) { return AndroidWebViewControllerCreationParams( androidWebViewProxy: androidWebViewProxy, @@ -489,7 +490,8 @@ class AndroidWebViewWidgetCreationParams super.layoutDirection, super.gestureRecognizers, this.displayWithHybridComposition = false, - @visibleForTesting InstanceManager? instanceManager, + @visibleForTesting + InstanceManager? instanceManager, @visibleForTesting this.platformViewsServiceProxy = const PlatformViewsServiceProxy(), }) : instanceManager = diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart b/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart index d1f5b9de873..8ae5ab0cece 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/legacy/webview_android_widget.dart @@ -22,10 +22,12 @@ class WebViewAndroidWidget extends StatefulWidget { required this.callbacksHandler, required this.javascriptChannelRegistry, required this.onBuildWidget, - @visibleForTesting this.webViewProxy = const WebViewProxy(), + @visibleForTesting + this.webViewProxy = const WebViewProxy(), @visibleForTesting this.flutterAssetManager = const android_webview.FlutterAssetManager(), - @visibleForTesting this.webStorage, + @visibleForTesting + this.webStorage, }); /// Initial parameters used to setup the WebView. @@ -87,10 +89,12 @@ class WebViewAndroidPlatformController extends WebViewPlatformController { required CreationParams creationParams, required this.callbacksHandler, required this.javascriptChannelRegistry, - @visibleForTesting this.webViewProxy = const WebViewProxy(), + @visibleForTesting + this.webViewProxy = const WebViewProxy(), @visibleForTesting this.flutterAssetManager = const android_webview.FlutterAssetManager(), - @visibleForTesting android_webview.WebStorage? webStorage, + @visibleForTesting + android_webview.WebStorage? webStorage, }) : webStorage = webStorage ?? android_webview.WebStorage.instance, assert(creationParams.webSettings?.hasNavigationDelegate != null), super(callbacksHandler) { @@ -624,15 +628,13 @@ class WebViewProxy { android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( android_webview.WebView webView, int errorCode, String description, String failingUrl, - )? - onReceivedError, + )? onReceivedError, void Function(android_webview.WebView webView, android_webview.WebResourceRequest request)? requestLoading, diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart index 5b7ce37db0d..cda0301b0a0 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart @@ -57,10 +57,8 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? - onShowFileChooser, - })? - createWebChromeClient, + )? onShowFileChooser, + })? createWebChromeClient, android_webview.WebView? mockWebView, android_webview.WebViewClient? mockWebViewClient, android_webview.WebStorage? mockWebStorage, @@ -80,8 +78,7 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? - onShowFileChooser, + )? onShowFileChooser, }) => MockWebChromeClient(), createAndroidWebView: () => nonNullMockWebView, @@ -101,19 +98,16 @@ void main() { int errorCode, String description, String failingUrl, - )? - onReceivedError, + )? onReceivedError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, android_webview.WebResourceError error, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( android_webview.WebView webView, android_webview.WebResourceRequest request, - )? - requestLoading, + )? requestLoading, void Function(android_webview.WebView webView, String url)? urlLoading, }) => @@ -574,8 +568,7 @@ void main() { Future> Function( android_webview.WebView webView, android_webview.FileChooserParams params, - )? - onShowFileChooser, + )? onShowFileChooser, }) { onShowFileChooserCallback = onShowFileChooser!; return mockWebChromeClient; diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart index c7f5e933175..aa16604176f 100644 --- a/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.mocks.dart @@ -720,26 +720,22 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? - onProgressChanged, + )? onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? - onShowFileChooser, + )? onShowFileChooser, }) get createAndroidWebChromeClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebChromeClient), returnValue: ({ void Function( _i2.WebView, int, - )? - onProgressChanged, + )? onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? - onShowFileChooser, + )? onShowFileChooser, }) => _FakeWebChromeClient_0( this, @@ -749,13 +745,11 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? - onProgressChanged, + )? onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? - onShowFileChooser, + )? onShowFileChooser, }) => _FakeWebChromeClient_0( this, @@ -765,97 +759,81 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, int, - )? - onProgressChanged, + )? onProgressChanged, _i9.Future> Function( _i2.WebView, _i2.FileChooserParams, - )? - onShowFileChooser, + )? onShowFileChooser, })); @override _i2.WebViewClient Function({ void Function( _i2.WebView, String, - )? - onPageFinished, + )? onPageFinished, void Function( _i2.WebView, String, - )? - onPageStarted, + )? onPageStarted, void Function( _i2.WebView, int, String, String, - )? - onReceivedError, + )? onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceResponse, - )? - onReceivedHttpError, + )? onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? - requestLoading, + )? requestLoading, void Function( _i2.WebView, String, - )? - urlLoading, + )? urlLoading, }) get createAndroidWebViewClient => (super.noSuchMethod( Invocation.getter(#createAndroidWebViewClient), returnValue: ({ void Function( _i2.WebView, String, - )? - onPageFinished, + )? onPageFinished, void Function( _i2.WebView, String, - )? - onPageStarted, + )? onPageStarted, void Function( _i2.WebView, int, String, String, - )? - onReceivedError, + )? onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceResponse, - )? - onReceivedHttpError, + )? onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? - requestLoading, + )? requestLoading, void Function( _i2.WebView, String, - )? - urlLoading, + )? urlLoading, }) => _FakeWebViewClient_1( this, @@ -865,42 +843,35 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, String, - )? - onPageFinished, + )? onPageFinished, void Function( _i2.WebView, String, - )? - onPageStarted, + )? onPageStarted, void Function( _i2.WebView, int, String, String, - )? - onReceivedError, + )? onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceResponse, - )? - onReceivedHttpError, + )? onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? - requestLoading, + )? requestLoading, void Function( _i2.WebView, String, - )? - urlLoading, + )? urlLoading, }) => _FakeWebViewClient_1( this, @@ -910,42 +881,35 @@ class MockAndroidWebViewProxy extends _i1.Mock void Function( _i2.WebView, String, - )? - onPageFinished, + )? onPageFinished, void Function( _i2.WebView, String, - )? - onPageStarted, + )? onPageStarted, void Function( _i2.WebView, int, String, String, - )? - onReceivedError, + )? onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceResponse, - )? - onReceivedHttpError, + )? onReceivedHttpError, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? - requestLoading, + )? requestLoading, void Function( _i2.WebView, String, - )? - urlLoading, + )? urlLoading, })); @override _i2.FlutterAssetManager Function() get createFlutterAssetManager => @@ -994,8 +958,7 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) - onDownloadStart}) get createDownloadListener => (super.noSuchMethod( + ) onDownloadStart}) get createDownloadListener => (super.noSuchMethod( Invocation.getter(#createDownloadListener), returnValue: ( {required void Function( @@ -1004,8 +967,7 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) - onDownloadStart}) => + ) onDownloadStart}) => _FakeDownloadListener_2( this, Invocation.getter(#createDownloadListener), @@ -1017,8 +979,7 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) - onDownloadStart}) => + ) onDownloadStart}) => _FakeDownloadListener_2( this, Invocation.getter(#createDownloadListener), @@ -1030,8 +991,7 @@ class MockAndroidWebViewProxy extends _i1.Mock String, String, int, - ) - onDownloadStart})); + ) onDownloadStart})); @override _i9.Future setWebContentsDebuggingEnabled(bool? enabled) => (super.noSuchMethod( @@ -1104,8 +1064,8 @@ class MockAndroidWebViewWidgetCreationParams extends _i1.Mock (super.noSuchMethod( Invocation.getter(#gestureRecognizers), returnValue: <_i11.Factory<_i12.OneSequenceGestureRecognizer>>{}, - returnValueForMissingStub: < - _i11.Factory<_i12.OneSequenceGestureRecognizer>>{}, + returnValueForMissingStub: <_i11 + .Factory<_i12.OneSequenceGestureRecognizer>>{}, ) as Set<_i11.Factory<_i12.OneSequenceGestureRecognizer>>); } diff --git a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart index dc190e5411d..b82f8dea91e 100644 --- a/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_android/test/legacy/webview_android_widget_test.mocks.dart @@ -954,36 +954,30 @@ class MockWebViewProxy extends _i1.Mock implements _i7.WebViewProxy { void Function( _i2.WebView, String, - )? - onPageStarted, + )? onPageStarted, void Function( _i2.WebView, String, - )? - onPageFinished, + )? onPageFinished, void Function( _i2.WebView, _i2.WebResourceRequest, _i2.WebResourceError, - )? - onReceivedRequestError, + )? onReceivedRequestError, void Function( _i2.WebView, int, String, String, - )? - onReceivedError, + )? onReceivedError, void Function( _i2.WebView, _i2.WebResourceRequest, - )? - requestLoading, + )? requestLoading, void Function( _i2.WebView, String, - )? - urlLoading, + )? urlLoading, }) => (super.noSuchMethod( Invocation.method( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart index 99826c2b9e5..65b3a8f78f7 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart @@ -655,8 +655,7 @@ class WebViewWidgetProxy { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, }) { return WKWebView(configuration, observeValue: observeValue); } @@ -666,8 +665,7 @@ class WebViewWidgetProxy { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) { return WKScriptMessageHandler( didReceiveScriptMessage: didReceiveScriptMessage, @@ -680,8 +678,7 @@ class WebViewWidgetProxy { WKWebView webView, WKWebViewConfiguration configuration, WKNavigationAction navigationAction, - )? - onCreateWebView, + )? onCreateWebView, }) { return WKUIDelegate(onCreateWebView: onCreateWebView); } @@ -694,8 +691,7 @@ class WebViewWidgetProxy { Future Function( WKWebView webView, WKNavigationAction navigationAction, - )? - decidePolicyForNavigationAction, + )? decidePolicyForNavigationAction, void Function(WKWebView webView, NSError error)? didFailNavigation, void Function(WKWebView webView, NSError error)? didFailProvisionalNavigation, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart index cbd500b0a33..e052a28c6a8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_proxy.dart @@ -38,8 +38,7 @@ class WebKitProxy { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, InstanceManager? instanceManager, }) createWebView; @@ -53,8 +52,7 @@ class WebKitProxy { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) createScriptMessageHandler; /// The default [WKWebsiteDataStore]. @@ -68,13 +66,11 @@ class WebKitProxy { Future Function( WKWebView webView, WKNavigationAction navigationAction, - )? - decidePolicyForNavigationAction, + )? decidePolicyForNavigationAction, Future Function( WKWebView webView, WKNavigationResponse navigationResponse, - )? - decidePolicyForNavigationResponse, + )? decidePolicyForNavigationResponse, void Function(WKWebView webView, NSError error)? didFailNavigation, void Function(WKWebView webView, NSError error)? didFailProvisionalNavigation, @@ -87,7 +83,6 @@ class WebKitProxy { WKWebView webView, WKWebViewConfiguration configuration, WKNavigationAction navigationAction, - )? - onCreateWebView, + )? onCreateWebView, }) createUIDelegate; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart index 8a9aab8ae06..9388bddd558 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.dart @@ -221,8 +221,7 @@ void main() { ); verify(mockWebViewConfiguration - .setMediaTypesRequiringUserActionForPlayback(< - WKAudiovisualMediaType>{ + .setMediaTypesRequiringUserActionForPlayback({ WKAudiovisualMediaType.all, })); }); @@ -240,8 +239,7 @@ void main() { ); verify(mockWebViewConfiguration - .setMediaTypesRequiringUserActionForPlayback(< - WKAudiovisualMediaType>{ + .setMediaTypesRequiringUserActionForPlayback({ WKAudiovisualMediaType.none, })); }); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart index ebce82c182f..6f5ffe0b5ac 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/legacy/web_kit_webview_widget_test.mocks.dart @@ -1174,8 +1174,7 @@ class MockWebViewWidgetProxy extends _i1.Mock String, _i7.NSObject, Map<_i7.NSKeyValueChangeKey, Object?>, - )? - observeValue, + )? observeValue, }) => (super.noSuchMethod( Invocation.method( @@ -1197,8 +1196,7 @@ class MockWebViewWidgetProxy extends _i1.Mock {required void Function( _i4.WKUserContentController, _i4.WKScriptMessage, - )? - didReceiveScriptMessage}) => + )? didReceiveScriptMessage}) => (super.noSuchMethod( Invocation.method( #createScriptMessageHandler, @@ -1220,8 +1218,7 @@ class MockWebViewWidgetProxy extends _i1.Mock _i4.WKWebView, _i4.WKWebViewConfiguration, _i4.WKNavigationAction, - )? - onCreateWebView}) => + )? onCreateWebView}) => (super.noSuchMethod( Invocation.method( #createUIDelgate, @@ -1242,28 +1239,23 @@ class MockWebViewWidgetProxy extends _i1.Mock void Function( _i4.WKWebView, String?, - )? - didFinishNavigation, + )? didFinishNavigation, void Function( _i4.WKWebView, String?, - )? - didStartProvisionalNavigation, + )? didStartProvisionalNavigation, _i5.Future<_i4.WKNavigationActionPolicy> Function( _i4.WKWebView, _i4.WKNavigationAction, - )? - decidePolicyForNavigationAction, + )? decidePolicyForNavigationAction, void Function( _i4.WKWebView, _i7.NSError, - )? - didFailNavigation, + )? didFailNavigation, void Function( _i4.WKWebView, _i7.NSError, - )? - didFailProvisionalNavigation, + )? didFailProvisionalNavigation, void Function(_i4.WKWebView)? webViewWebContentProcessDidTerminate, }) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index 84cdebcc436..2661c1d43e9 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -45,10 +45,8 @@ void main() { String keyPath, NSObject object, Map change, - )? - observeValue, - })? - createMockWebView, + )? observeValue, + })? createMockWebView, MockWKWebViewConfiguration? mockWebViewConfiguration, InstanceManager? instanceManager, }) { @@ -68,8 +66,7 @@ void main() { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, InstanceManager? instanceManager, }) { nonNullMockWebView = createMockWebView == null @@ -661,8 +658,7 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -707,8 +703,7 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -747,8 +742,7 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) { return WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, @@ -838,8 +832,7 @@ void main() { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, }) { webViewObserveValue = observeValue!; return mockWebView; @@ -900,8 +893,7 @@ void main() { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, }) { webViewObserveValue = observeValue!; return mockWebView; @@ -966,8 +958,7 @@ void main() { required void Function( WKUserContentController userContentController, WKScriptMessage message, - ) - didReceiveScriptMessage, + ) didReceiveScriptMessage, }) { messageHandler = WKScriptMessageHandler.detached( didReceiveScriptMessage: didReceiveScriptMessage, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart index 2a6434be4f0..bc02bea0328 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.dart @@ -32,8 +32,7 @@ void main() { String keyPath, NSObject object, Map change, - )? - observeValue, + )? observeValue, InstanceManager? instanceManager, }) { final WKWebView webView = WKWebView.detached( From 79e234d4b6ee25ade12bd98b8bd5a55d92d90a02 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 5 Apr 2023 16:51:39 +0200 Subject: [PATCH 18/21] Fixes feedback --- .../lib/src/foundation/foundation.dart | 2 +- .../webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart | 2 +- .../test/webkit_navigation_delegate_test.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart index ac10e94534d..850f148cfd9 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart @@ -209,7 +209,7 @@ class NSHttpUrlResponse { required this.statusCode, }); - /// The URL being requested. + /// The response’s HTTP status code. final int statusCode; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart index 5879d337468..0834709b93b 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart @@ -177,7 +177,7 @@ class WKNavigationAction { final WKNavigationType navigationType; } -/// An object that contains information about a response to a navigation request,. +/// An object that contains information about a response to a navigation request. /// /// Wraps [WKNavigationResponse](https://developer.apple.com/documentation/webkit/wknavigationresponse?language=objc). @immutable diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart index 97429d46ad4..84db11269c7 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart @@ -75,7 +75,7 @@ void main() { expect(callbackUrl, 'https://www.google.com'); }); - test('setOnPageError from decidePolicyForNavigationResponse', () { + test('setOnHttpError from decidePolicyForNavigationResponse', () { final WebKitNavigationDelegate webKitDelgate = WebKitNavigationDelegate( const WebKitNavigationDelegateCreationParams( webKitProxy: WebKitProxy( From 68d3922ef3d74322a20c5aac3ed9f2a1be1992a4 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 12 Apr 2023 13:03:53 +0200 Subject: [PATCH 19/21] Removes dependency overrides for webview_flutter_platform_interface --- packages/webview_flutter/webview_flutter/pubspec.yaml | 4 +--- .../webview_flutter/webview_flutter_android/pubspec.yaml | 8 +------- .../webview_flutter_wkwebview/pubspec.yaml | 8 +------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index c16e7c33a4f..205d67dc504 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter webview_flutter_android: ^3.0.0 - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 webview_flutter_wkwebview: ^3.0.0 dev_dependencies: @@ -37,7 +37,5 @@ dev_dependencies: dependency_overrides: webview_flutter_android: path: ../../webview_flutter/webview_flutter_android - webview_flutter_platform_interface: - path: ../../webview_flutter/webview_flutter_platform_interface webview_flutter_wkwebview: path: ../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 6e452dfe0d4..e255266c745 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -20,7 +20,7 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 dev_dependencies: build_runner: ^2.1.4 @@ -30,9 +30,3 @@ dev_dependencies: sdk: flutter mockito: 5.4.0 pigeon: ^9.0.5 - - -# FOR TESTING ONLY. DO NOT MERGE. -dependency_overrides: - webview_flutter_platform_interface: - path: ../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 1fbb20c59b5..f82a846da69 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter path: ^1.8.0 - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 dev_dependencies: build_runner: ^2.1.5 @@ -30,9 +30,3 @@ dev_dependencies: sdk: flutter mockito: 5.4.0 pigeon: ^7.0.5 - - -# FOR TESTING ONLY. DO NOT MERGE. -dependency_overrides: - webview_flutter_platform_interface: - path: ../../webview_flutter/webview_flutter_platform_interface From 6d625c1999c764b3eb896bf0dc5de2849d58d9e5 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 12 Apr 2023 15:27:28 +0200 Subject: [PATCH 20/21] Fixes build errors --- packages/webview_flutter/webview_flutter/example/pubspec.yaml | 4 +--- .../webview_flutter_android/example/pubspec.yaml | 4 +--- .../webview_flutter_wkwebview/example/pubspec.yaml | 4 +--- .../ios/Classes/FWFGeneratedWebKitApis.h | 4 ++-- .../ios/Classes/FWFGeneratedWebKitApis.m | 2 +- .../ios/Classes/FWFNavigationDelegateHostApi.m | 4 ++-- .../webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 7 files changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/webview_flutter/example/pubspec.yaml index 2dda5c102ee..60e57cfd276 100644 --- a/packages/webview_flutter/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/example/pubspec.yaml @@ -29,7 +29,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 flutter: uses-material-design: true @@ -44,7 +44,5 @@ flutter: dependency_overrides: webview_flutter_android: path: ../../../webview_flutter/webview_flutter_android - webview_flutter_platform_interface: - path: ../../../webview_flutter/webview_flutter_platform_interface webview_flutter_wkwebview: path: ../../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml index a33b92e099e..38e1c4b061f 100644 --- a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 dev_dependencies: espresso: ^0.2.0 @@ -41,5 +41,3 @@ flutter: dependency_overrides: webview_flutter_android: path: ../../../webview_flutter/webview_flutter_android - webview_flutter_platform_interface: - path: ../../../webview_flutter/webview_flutter_platform_interface diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml index 6ffb053c16e..d4c370dc93c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter path_provider: ^2.0.6 - webview_flutter_platform_interface: ^2.0.0 + webview_flutter_platform_interface: ^2.2.0 webview_flutter_wkwebview: # When depending on this package from a real application you should use: # webview_flutter: ^x.y.z @@ -38,7 +38,5 @@ flutter: # FOR TESTING ONLY. DO NOT MERGE. dependency_overrides: - webview_flutter_platform_interface: - path: ../../../webview_flutter/webview_flutter_platform_interface webview_flutter_wkwebview: path: ../../../webview_flutter/webview_flutter_wkwebview diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h index ad5cfc36303..b47ee8726c8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h @@ -570,7 +570,7 @@ NSObject *FWFWKNavigationDelegateFlutterApiGetCodec(void); completion: (void (^)(FWFWKNavigationActionPolicyEnumData *_Nullable, - NSError *_Nullable))completion; + FlutterError *_Nullable))completion; - (void) decidePolicyForNavigationResponseForDelegateWithIdentifier:(NSNumber *)identifier webViewIdentifier:(NSNumber *)webViewIdentifier @@ -580,7 +580,7 @@ NSObject *FWFWKNavigationDelegateFlutterApiGetCodec(void); (void (^)( FWFWKNavigationResponsePolicyEnumData *_Nullable, - NSError *_Nullable))completion; + FlutterError *_Nullable))completion; - (void)didFailNavigationForDelegateWithIdentifier:(NSNumber *)identifier webViewIdentifier:(NSNumber *)webViewIdentifier error:(FWFNSErrorData *)error diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m index 769f01c62fc..077ff13ed63 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m @@ -1605,7 +1605,7 @@ - (void)decidePolicyForNavigationActionForDelegateWithIdentifier:(NSNumber *)arg (void (^)( FWFWKNavigationResponsePolicyEnumData *_Nullable, - NSError *_Nullable))completion { + FlutterError *_Nullable))completion { FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel messageChannelWithName: @"dev.flutter.pigeon.WKNavigationDelegateFlutterApi.decidePolicyForNavigationResponse" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m index 1359c6e382d..210ed4c88f1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFNavigationDelegateHostApi.m @@ -75,7 +75,7 @@ - (void)decidePolicyForNavigationResponseForDelegate:(FWFNavigationDelegate *)in completion: (void (^)( FWFWKNavigationResponsePolicyEnumData *_Nullable, - NSError *_Nullable))completion { + FlutterError *_Nullable))completion { NSNumber *webViewIdentifier = @([self.instanceManager identifierWithStrongReferenceForInstance:webView]); FWFWKNavigationResponseData *navigationResponseData = @@ -178,7 +178,7 @@ - (void)webView:(WKWebView *)webView webView:webView navigationResponse:navigationResponse completion:^(FWFWKNavigationResponsePolicyEnumData *policy, - NSError *error) { + FlutterError *error) { NSAssert(!error, @"%@", error); decisionHandler( FWFWKNavigationResponsePolicyFromEnumData(policy)); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index f82a846da69..36420f84de7 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -29,4 +29,4 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.0 - pigeon: ^7.0.5 + pigeon: ^9.2.4 From 6d5e06090c9d1e196eaa42ed0ef6a8822b5f05a9 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 12 Apr 2023 17:15:23 +0200 Subject: [PATCH 21/21] Fixes Android build errors --- .../android/lint-baseline.xml | 1824 +++-------------- .../GeneratedAndroidWebView.java | 972 ++++----- .../lib/src/android_webview.g.dart | 2 +- .../webview_flutter_android/pubspec.yaml | 2 +- .../test/test_android_webview.g.dart | 386 +++- 5 files changed, 947 insertions(+), 2239 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml b/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml index 10821e05e8b..55eba2e6f45 100644 --- a/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml +++ b/packages/webview_flutter/webview_flutter_android/android/lint-baseline.xml @@ -3,1621 +3,334 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + message="Access to `private` field `webViewClient` of class `SecureWebChromeClient` requires synthetic accessor" + errorLine1=" if (!webViewClient.shouldOverrideUrlLoading(view, request)) {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java" + line="127" + column="20"/> + id="SyntheticAccessor" + message="Access to `private` field `webViewClient` of class `SecureWebChromeClient` requires synthetic accessor" + errorLine1=" if (!webViewClient.shouldOverrideUrlLoading(view, url)) {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java" + line="137" + column="20"/> + id="LambdaLast" + message="Functional interface parameters (such as parameter 2, "filePathCallback", in io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientImpl.onShowFileChooser) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions" + errorLine1=" FileChooserParams fileChooserParams) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java" + line="58" + column="9"/> + errorLine1=" BinaryMessenger binaryMessenger, InstanceManager instanceManager) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="26" + column="7"/> - - - - - - - - - - - - - - - - + errorLine1=" DownloadListener downloadListener," + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="33" + column="7"/> + errorLine1=" String url," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="34" + column="7"/> + errorLine1=" String userAgent," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="35" + column="7"/> + errorLine1=" String contentDisposition," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="36" + column="7"/> + errorLine1=" String mimetype," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="37" + column="7"/> + errorLine1=" Reply<Void> callback) {" + errorLine2=" ~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerFlutterApiImpl.java" + line="39" + column="7"/> + errorLine1=" String url," + errorLine2=" ~~~~~~"> + errorLine1=" String userAgent," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="39" + column="9"/> + errorLine1=" String contentDisposition," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="40" + column="9"/> + errorLine1=" String mimetype," + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="41" + column="9"/> + errorLine1=" public DownloadListenerImpl createDownloadListener(DownloadListenerFlutterApiImpl flutterApi) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="56" + column="12"/> + errorLine1=" public DownloadListenerImpl createDownloadListener(DownloadListenerFlutterApiImpl flutterApi) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="56" + column="56"/> + errorLine1=" InstanceManager instanceManager," + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="69" + column="7"/> + errorLine1=" DownloadListenerCreator downloadListenerCreator," + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="70" + column="7"/> + errorLine1=" DownloadListenerFlutterApiImpl flutterApi) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="71" + column="7"/> + errorLine1=" public void create(Long instanceId) {" + errorLine2=" ~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/DownloadListenerHostApiImpl.java" + line="78" + column="22"/> + errorLine1=" BinaryMessenger binaryMessenger, InstanceManager instanceManager) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java" + line="31" + column="7"/> + errorLine1=" BinaryMessenger binaryMessenger, InstanceManager instanceManager) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java" + line="31" + column="40"/> + errorLine1=" public void create(WebChromeClient.FileChooserParams instance, Reply<Void> callback) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java" + line="61" + column="22"/> + errorLine1=" public void create(WebChromeClient.FileChooserParams instance, Reply<Void> callback) {" + errorLine2=" ~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FileChooserParamsFlutterApiImpl.java" + line="61" + column="66"/> + errorLine1=" public FlutterAssetManagerHostApiImpl(FlutterAssetManager flutterAssetManager) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java" + line="23" + column="41"/> + errorLine1=" public List<String> list(String path) {" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java" + line="28" + column="10"/> + errorLine1=" public List<String> list(String path) {" + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java" + line="28" + column="28"/> + errorLine1=" public String getAssetFilePathByName(String name) {" + errorLine2=" ~~~~~~"> + file="src/main/java/io/flutter/plugins/webviewflutter/FlutterAssetManagerHostApiImpl.java" + line="43" + column="10"/> + errorLine1=" public String getAssetFilePathByName(String name) {" + errorLine2=" ~~~~~~"> - - - - @@ -2571,7 +1284,7 @@ errorLine2=" ~~~~~~~~~~~~~~~"> @@ -2582,7 +1295,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2593,7 +1306,7 @@ errorLine2=" ~~~~~~~"> @@ -2604,7 +1317,7 @@ errorLine2=" ~~~~~~"> @@ -2615,7 +1328,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2626,7 +1339,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2637,7 +1350,7 @@ errorLine2=" ~~~~~~~"> @@ -2648,7 +1361,7 @@ errorLine2=" ~~~~~~"> @@ -2659,7 +1372,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2670,7 +1383,62 @@ errorLine2=" ~~~~~~~~~~~~~"> + + + + + + + + + + + + + + + + + + + + @@ -2681,7 +1449,7 @@ errorLine2=" ~~~~~~~"> @@ -2692,7 +1460,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -2703,7 +1471,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~"> @@ -2714,7 +1482,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2725,7 +1493,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2736,7 +1504,7 @@ errorLine2=" ~~~~~~~"> @@ -2747,7 +1515,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -2758,7 +1526,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> @@ -2769,7 +1537,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2780,7 +1548,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2791,7 +1559,7 @@ errorLine2=" ~~~~~~~"> @@ -2802,7 +1570,7 @@ errorLine2=" ~~~~"> @@ -2813,7 +1581,7 @@ errorLine2=" ~~~~~~"> @@ -2824,7 +1592,7 @@ errorLine2=" ~~~~~~"> @@ -2835,7 +1603,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2846,7 +1614,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2857,7 +1625,7 @@ errorLine2=" ~~~~~~~"> @@ -2868,7 +1636,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -2879,7 +1647,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2890,7 +1658,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -2901,7 +1669,7 @@ errorLine2=" ~~~~~~~"> @@ -2912,7 +1680,7 @@ errorLine2=" ~~~~~~"> @@ -2923,7 +1691,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -2934,7 +1702,7 @@ errorLine2=" ~~~~~~~"> @@ -2945,7 +1713,7 @@ errorLine2=" ~~~~~~"> @@ -2956,7 +1724,7 @@ errorLine2=" ~~~~~~"> @@ -2967,7 +1735,7 @@ errorLine2=" ~~~~~~~"> @@ -2978,10 +1746,43 @@ errorLine2=" ~~~~~~"> + + + + + + + + + + + + @@ -3000,7 +1801,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -3011,7 +1812,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~"> @@ -3022,7 +1823,7 @@ errorLine2=" ~~~~~~~"> @@ -3033,7 +1834,7 @@ errorLine2=" ~~~~~~"> @@ -3044,7 +1845,7 @@ errorLine2=" ~~~~~~"> @@ -3055,7 +1856,7 @@ errorLine2=" ~~~~~~~"> @@ -3066,7 +1867,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> @@ -3077,7 +1878,7 @@ errorLine2=" ~~~~~~~"> @@ -3088,7 +1889,7 @@ errorLine2=" ~~~~~~"> @@ -3099,7 +1900,7 @@ errorLine2=" ~~~~~~~"> @@ -3110,7 +1911,7 @@ errorLine2=" ~~~~~~~~"> @@ -3121,7 +1922,7 @@ errorLine2=" ~~~~~~~"> @@ -3132,7 +1933,7 @@ errorLine2=" ~~~~~~"> @@ -3143,7 +1944,7 @@ errorLine2=" ~~~~~~"> @@ -3154,7 +1955,7 @@ errorLine2=" ~~~~~~~"> @@ -3165,10 +1966,21 @@ errorLine2=" ~~~~~~"> + + + + @@ -3187,7 +1999,7 @@ errorLine2=" ~~~~~~"> @@ -3198,7 +2010,7 @@ errorLine2=" ~~~~~~"> @@ -3209,7 +2021,7 @@ errorLine2=" ~~~~~~~"> @@ -3220,7 +2032,7 @@ errorLine2=" ~~~~~~"> @@ -3231,7 +2043,7 @@ errorLine2=" ~~~~~~~"> @@ -3242,7 +2054,7 @@ errorLine2=" ~~~~~~~~"> @@ -3253,7 +2065,7 @@ errorLine2=" ~~~~~~~~~~~~~"> @@ -3264,7 +2076,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -3275,7 +2087,7 @@ errorLine2=" ~~~~~~~~~~~~~~~"> @@ -3286,7 +2098,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> @@ -3297,7 +2109,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java index 3cfa1533860..e2063936fdb 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.0.5), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon package io.flutter.plugins.webviewflutter; @@ -22,15 +22,39 @@ import java.util.Map; /** Generated class from Pigeon. */ -@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) public class GeneratedAndroidWebView { + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + super(message); + this.code = code; + this.details = details; + } + } + @NonNull - private static ArrayList wrapError(@NonNull Throwable exception) { + protected static ArrayList wrapError(@NonNull Throwable exception) { ArrayList errorList = new ArrayList(3); - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } return errorList; } @@ -63,7 +87,7 @@ public enum FileChooserMode { */ SAVE(2); - private final int index; + final int index; private FileChooserMode(final int index) { this.index = index; @@ -85,8 +109,8 @@ public void setValue(@NonNull FileChooserMode setterArg) { this.value = setterArg; } - /** Constructor is private to enforce null safety; use Builder. */ - private FileChooserModeEnumData() {} + /** Constructor is non-public to enforce null safety; use Builder. */ + FileChooserModeEnumData() {} public static final class Builder { @@ -196,8 +220,8 @@ public void setRequestHeaders(@NonNull Map setterArg) { this.requestHeaders = setterArg; } - /** Constructor is private to enforce null safety; use Builder. */ - private WebResourceRequestData() {} + /** Constructor is non-public to enforce null safety; use Builder. */ + WebResourceRequestData() {} public static final class Builder { @@ -300,8 +324,8 @@ public void setStatusCode(@NonNull Long setterArg) { this.statusCode = setterArg; } - /** Constructor is private to enforce null safety; use Builder. */ - private WebResourceResponseData() {} + /** Constructor is non-public to enforce null safety; use Builder. */ + WebResourceResponseData() {} public static final class Builder { @@ -365,8 +389,8 @@ public void setDescription(@NonNull String setterArg) { this.description = setterArg; } - /** Constructor is private to enforce null safety; use Builder. */ - private WebResourceErrorData() {} + /** Constructor is non-public to enforce null safety; use Builder. */ + WebResourceErrorData() {} public static final class Builder { @@ -441,8 +465,8 @@ public void setY(@NonNull Long setterArg) { this.y = setterArg; } - /** Constructor is private to enforce null safety; use Builder. */ - private WebViewPoint() {} + /** Constructor is non-public to enforce null safety; use Builder. */ + WebViewPoint() {} public static final class Builder { @@ -487,9 +511,10 @@ ArrayList toList() { } public interface Result { + @SuppressWarnings("UnknownNullness") void success(T result); - void error(Throwable error); + void error(@NonNull Throwable error); } /** * Host API for managing the native `InstanceManager`. @@ -505,14 +530,15 @@ public interface InstanceManagerHostApi { void clear(); /** The codec used by InstanceManagerHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `InstanceManagerHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, InstanceManagerHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable InstanceManagerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -524,7 +550,7 @@ static void setup(BinaryMessenger binaryMessenger, InstanceManagerHostApi api) { try { api.clear(); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -550,13 +576,13 @@ public interface JavaObjectHostApi { void dispose(@NonNull Long identifier); /** The codec used by JavaObjectHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable JavaObjectHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -565,16 +591,12 @@ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number identifierArg = (Number) args.get(0); - if (identifierArg == null) { - throw new NullPointerException("identifierArg unexpectedly null."); - } api.dispose((identifierArg == null) ? null : identifierArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -594,22 +616,23 @@ static void setup(BinaryMessenger binaryMessenger, JavaObjectHostApi api) { *

Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class JavaObjectFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public JavaObjectFlutterApi(BinaryMessenger argBinaryMessenger) { + public JavaObjectFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by JavaObjectFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } - public void dispose(@NonNull Long identifierArg, Reply callback) { + public void dispose(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec()); @@ -621,19 +644,20 @@ public void dispose(@NonNull Long identifierArg, Reply callback) { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ public interface CookieManagerHostApi { - void clearCookies(Result result); + void clearCookies(@NonNull Result result); void setCookie(@NonNull String url, @NonNull String value); /** The codec used by CookieManagerHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `CookieManagerHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, CookieManagerHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable CookieManagerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -644,25 +668,20 @@ static void setup(BinaryMessenger binaryMessenger, CookieManagerHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Boolean result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.clearCookies(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Boolean result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.clearCookies(resultCallback); }); } else { channel.setMessageHandler(null); @@ -676,20 +695,13 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String urlArg = (String) args.get(0); + String valueArg = (String) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - String urlArg = (String) args.get(0); - if (urlArg == null) { - throw new NullPointerException("urlArg unexpectedly null."); - } - String valueArg = (String) args.get(1); - if (valueArg == null) { - throw new NullPointerException("valueArg unexpectedly null."); - } api.setCookie(urlArg, valueArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -770,7 +782,7 @@ void loadUrl( void clearCache(@NonNull Long instanceId, @NonNull Boolean includeDiskFiles); void evaluateJavascript( - @NonNull Long instanceId, @NonNull String javascriptString, Result result); + @NonNull Long instanceId, @NonNull String javascriptString, @NonNull Result result); @Nullable String getTitle(@NonNull Long instanceId); @@ -804,11 +816,11 @@ void removeJavaScriptChannel( void setBackgroundColor(@NonNull Long instanceId, @NonNull Long color); /** The codec used by WebViewHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return WebViewHostApiCodec.INSTANCE; } /** Sets up an instance of `WebViewHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable WebViewHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -817,16 +829,12 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.create((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -844,26 +852,19 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String dataArg = (String) args.get(1); + String mimeTypeArg = (String) args.get(2); + String encodingArg = (String) args.get(3); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String dataArg = (String) args.get(1); - if (dataArg == null) { - throw new NullPointerException("dataArg unexpectedly null."); - } - String mimeTypeArg = (String) args.get(2); - String encodingArg = (String) args.get(3); api.loadData( (instanceIdArg == null) ? null : instanceIdArg.longValue(), dataArg, mimeTypeArg, encodingArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -883,21 +884,14 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String baseUrlArg = (String) args.get(1); + String dataArg = (String) args.get(2); + String mimeTypeArg = (String) args.get(3); + String encodingArg = (String) args.get(4); + String historyUrlArg = (String) args.get(5); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String baseUrlArg = (String) args.get(1); - String dataArg = (String) args.get(2); - if (dataArg == null) { - throw new NullPointerException("dataArg unexpectedly null."); - } - String mimeTypeArg = (String) args.get(3); - String encodingArg = (String) args.get(4); - String historyUrlArg = (String) args.get(5); api.loadDataWithBaseUrl( (instanceIdArg == null) ? null : instanceIdArg.longValue(), baseUrlArg, @@ -906,7 +900,7 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { encodingArg, historyUrlArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -924,27 +918,17 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String urlArg = (String) args.get(1); + Map headersArg = (Map) args.get(2); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String urlArg = (String) args.get(1); - if (urlArg == null) { - throw new NullPointerException("urlArg unexpectedly null."); - } - Map headersArg = (Map) args.get(2); - if (headersArg == null) { - throw new NullPointerException("headersArg unexpectedly null."); - } api.loadUrl( (instanceIdArg == null) ? null : instanceIdArg.longValue(), urlArg, headersArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -962,25 +946,15 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String urlArg = (String) args.get(1); + byte[] dataArg = (byte[]) args.get(2); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String urlArg = (String) args.get(1); - if (urlArg == null) { - throw new NullPointerException("urlArg unexpectedly null."); - } - byte[] dataArg = (byte[]) args.get(2); - if (dataArg == null) { - throw new NullPointerException("dataArg unexpectedly null."); - } api.postUrl( (instanceIdArg == null) ? null : instanceIdArg.longValue(), urlArg, dataArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -998,17 +972,13 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } String output = api.getUrl((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1026,17 +996,13 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } Boolean output = api.canGoBack((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1054,17 +1020,13 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } Boolean output = api.canGoForward((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1082,16 +1044,12 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.goBack((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1109,16 +1067,12 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.goForward((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1136,16 +1090,12 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.reload((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1163,22 +1113,15 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean includeDiskFilesArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean includeDiskFilesArg = (Boolean) args.get(1); - if (includeDiskFilesArg == null) { - throw new NullPointerException("includeDiskFilesArg unexpectedly null."); - } api.clearCache( (instanceIdArg == null) ? null : instanceIdArg.longValue(), includeDiskFilesArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1198,38 +1141,26 @@ static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String javascriptStringArg = (String) args.get(1); - if (javascriptStringArg == null) { - throw new NullPointerException("javascriptStringArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.evaluateJavascript( - (instanceIdArg == null) ? null : instanceIdArg.longValue(), - javascriptStringArg, - resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String javascriptStringArg = (String) args.get(1); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.evaluateJavascript( + (instanceIdArg == null) ? null : instanceIdArg.longValue(), + javascriptStringArg, + resultCallback); }); } else { channel.setMessageHandler(null); @@ -1243,17 +1174,13 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } String output = api.getTitle((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1271,27 +1198,17 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number xArg = (Number) args.get(1); + Number yArg = (Number) args.get(2); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number xArg = (Number) args.get(1); - if (xArg == null) { - throw new NullPointerException("xArg unexpectedly null."); - } - Number yArg = (Number) args.get(2); - if (yArg == null) { - throw new NullPointerException("yArg unexpectedly null."); - } api.scrollTo( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (xArg == null) ? null : xArg.longValue(), (yArg == null) ? null : yArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1309,27 +1226,17 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number xArg = (Number) args.get(1); + Number yArg = (Number) args.get(2); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number xArg = (Number) args.get(1); - if (xArg == null) { - throw new NullPointerException("xArg unexpectedly null."); - } - Number yArg = (Number) args.get(2); - if (yArg == null) { - throw new NullPointerException("yArg unexpectedly null."); - } api.scrollBy( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (xArg == null) ? null : xArg.longValue(), (yArg == null) ? null : yArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1347,17 +1254,13 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } Long output = api.getScrollX((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1375,17 +1278,13 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } Long output = api.getScrollY((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1403,18 +1302,14 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } WebViewPoint output = api.getScrollPosition( (instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1434,16 +1329,12 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Boolean enabledArg = (Boolean) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean enabledArg = (Boolean) args.get(0); - if (enabledArg == null) { - throw new NullPointerException("enabledArg unexpectedly null."); - } api.setWebContentsDebuggingEnabled(enabledArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1461,24 +1352,17 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number webViewClientInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number webViewClientInstanceIdArg = (Number) args.get(1); - if (webViewClientInstanceIdArg == null) { - throw new NullPointerException("webViewClientInstanceIdArg unexpectedly null."); - } api.setWebViewClient( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (webViewClientInstanceIdArg == null) ? null : webViewClientInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1498,25 +1382,17 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number javaScriptChannelInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number javaScriptChannelInstanceIdArg = (Number) args.get(1); - if (javaScriptChannelInstanceIdArg == null) { - throw new NullPointerException( - "javaScriptChannelInstanceIdArg unexpectedly null."); - } api.addJavaScriptChannel( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (javaScriptChannelInstanceIdArg == null) ? null : javaScriptChannelInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1536,25 +1412,17 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number javaScriptChannelInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number javaScriptChannelInstanceIdArg = (Number) args.get(1); - if (javaScriptChannelInstanceIdArg == null) { - throw new NullPointerException( - "javaScriptChannelInstanceIdArg unexpectedly null."); - } api.removeJavaScriptChannel( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (javaScriptChannelInstanceIdArg == null) ? null : javaScriptChannelInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1574,19 +1442,15 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number listenerInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number listenerInstanceIdArg = (Number) args.get(1); api.setDownloadListener( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (listenerInstanceIdArg == null) ? null : listenerInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1606,19 +1470,15 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number clientInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number clientInstanceIdArg = (Number) args.get(1); api.setWebChromeClient( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (clientInstanceIdArg == null) ? null : clientInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1638,22 +1498,15 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number colorArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number colorArg = (Number) args.get(1); - if (colorArg == null) { - throw new NullPointerException("colorArg unexpectedly null."); - } api.setBackgroundColor( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (colorArg == null) ? null : colorArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1676,22 +1529,23 @@ public void error(Throwable error) { *

Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class WebViewFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public WebViewFlutterApi(BinaryMessenger argBinaryMessenger) { + public WebViewFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by WebViewFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** Create a new Dart instance and add it to the `InstanceManager`. */ - public void create(@NonNull Long identifierArg, Reply callback) { + public void create(@NonNull Long identifierArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.WebViewFlutterApi.create", getCodec()); @@ -1732,13 +1586,13 @@ public interface WebSettingsHostApi { void setTextZoom(@NonNull Long instanceId, @NonNull Long textZoom); /** The codec used by WebSettingsHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `WebSettingsHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable WebSettingsHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -1747,22 +1601,15 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number webViewInstanceIdArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number webViewInstanceIdArg = (Number) args.get(1); - if (webViewInstanceIdArg == null) { - throw new NullPointerException("webViewInstanceIdArg unexpectedly null."); - } api.create( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (webViewInstanceIdArg == null) ? null : webViewInstanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1782,21 +1629,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean flagArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean flagArg = (Boolean) args.get(1); - if (flagArg == null) { - throw new NullPointerException("flagArg unexpectedly null."); - } api.setDomStorageEnabled( (instanceIdArg == null) ? null : instanceIdArg.longValue(), flagArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1816,21 +1656,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean flagArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean flagArg = (Boolean) args.get(1); - if (flagArg == null) { - throw new NullPointerException("flagArg unexpectedly null."); - } api.setJavaScriptCanOpenWindowsAutomatically( (instanceIdArg == null) ? null : instanceIdArg.longValue(), flagArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1850,21 +1683,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean supportArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean supportArg = (Boolean) args.get(1); - if (supportArg == null) { - throw new NullPointerException("supportArg unexpectedly null."); - } api.setSupportMultipleWindows( (instanceIdArg == null) ? null : instanceIdArg.longValue(), supportArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1884,21 +1710,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean flagArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean flagArg = (Boolean) args.get(1); - if (flagArg == null) { - throw new NullPointerException("flagArg unexpectedly null."); - } api.setJavaScriptEnabled( (instanceIdArg == null) ? null : instanceIdArg.longValue(), flagArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1918,19 +1737,15 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String userAgentStringArg = (String) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String userAgentStringArg = (String) args.get(1); api.setUserAgentString( (instanceIdArg == null) ? null : instanceIdArg.longValue(), userAgentStringArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1950,21 +1765,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean requireArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean requireArg = (Boolean) args.get(1); - if (requireArg == null) { - throw new NullPointerException("requireArg unexpectedly null."); - } api.setMediaPlaybackRequiresUserGesture( (instanceIdArg == null) ? null : instanceIdArg.longValue(), requireArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1984,21 +1792,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean supportArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean supportArg = (Boolean) args.get(1); - if (supportArg == null) { - throw new NullPointerException("supportArg unexpectedly null."); - } api.setSupportZoom( (instanceIdArg == null) ? null : instanceIdArg.longValue(), supportArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2018,21 +1819,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean overviewArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean overviewArg = (Boolean) args.get(1); - if (overviewArg == null) { - throw new NullPointerException("overviewArg unexpectedly null."); - } api.setLoadWithOverviewMode( (instanceIdArg == null) ? null : instanceIdArg.longValue(), overviewArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2052,21 +1846,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean useArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean useArg = (Boolean) args.get(1); - if (useArg == null) { - throw new NullPointerException("useArg unexpectedly null."); - } api.setUseWideViewPort( (instanceIdArg == null) ? null : instanceIdArg.longValue(), useArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2086,21 +1873,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean enabledArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean enabledArg = (Boolean) args.get(1); - if (enabledArg == null) { - throw new NullPointerException("enabledArg unexpectedly null."); - } api.setDisplayZoomControls( (instanceIdArg == null) ? null : instanceIdArg.longValue(), enabledArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2120,21 +1900,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean enabledArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean enabledArg = (Boolean) args.get(1); - if (enabledArg == null) { - throw new NullPointerException("enabledArg unexpectedly null."); - } api.setBuiltInZoomControls( (instanceIdArg == null) ? null : instanceIdArg.longValue(), enabledArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2154,21 +1927,14 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean enabledArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean enabledArg = (Boolean) args.get(1); - if (enabledArg == null) { - throw new NullPointerException("enabledArg unexpectedly null."); - } api.setAllowFileAccess( (instanceIdArg == null) ? null : instanceIdArg.longValue(), enabledArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2186,22 +1952,15 @@ static void setup(BinaryMessenger binaryMessenger, WebSettingsHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Number textZoomArg = (Number) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Number textZoomArg = (Number) args.get(1); - if (textZoomArg == null) { - throw new NullPointerException("textZoomArg unexpectedly null."); - } api.setTextZoom( (instanceIdArg == null) ? null : instanceIdArg.longValue(), (textZoomArg == null) ? null : textZoomArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2219,14 +1978,15 @@ public interface JavaScriptChannelHostApi { void create(@NonNull Long instanceId, @NonNull String channelName); /** The codec used by JavaScriptChannelHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `JavaScriptChannelHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, JavaScriptChannelHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable JavaScriptChannelHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2235,21 +1995,14 @@ static void setup(BinaryMessenger binaryMessenger, JavaScriptChannelHostApi api) channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + String channelNameArg = (String) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - String channelNameArg = (String) args.get(1); - if (channelNameArg == null) { - throw new NullPointerException("channelNameArg unexpectedly null."); - } api.create( (instanceIdArg == null) ? null : instanceIdArg.longValue(), channelNameArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2263,23 +2016,24 @@ static void setup(BinaryMessenger binaryMessenger, JavaScriptChannelHostApi api) } /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class JavaScriptChannelFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public JavaScriptChannelFlutterApi(BinaryMessenger argBinaryMessenger) { + public JavaScriptChannelFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by JavaScriptChannelFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } public void postMessage( - @NonNull Long instanceIdArg, @NonNull String messageArg, Reply callback) { + @NonNull Long instanceIdArg, @NonNull String messageArg, @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2299,14 +2053,15 @@ void setSynchronousReturnValueForShouldOverrideUrlLoading( @NonNull Long instanceId, @NonNull Boolean value); /** The codec used by WebViewClientHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `WebViewClientHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable WebViewClientHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2315,16 +2070,12 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.create((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2344,21 +2095,14 @@ static void setup(BinaryMessenger binaryMessenger, WebViewClientHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean valueArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean valueArg = (Boolean) args.get(1); - if (valueArg == null) { - throw new NullPointerException("valueArg unexpectedly null."); - } api.setSynchronousReturnValueForShouldOverrideUrlLoading( (instanceIdArg == null) ? null : instanceIdArg.longValue(), valueArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2409,18 +2153,19 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class WebViewClientFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public WebViewClientFlutterApi(BinaryMessenger argBinaryMessenger) { + public WebViewClientFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by WebViewClientFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return WebViewClientFlutterApiCodec.INSTANCE; } @@ -2428,7 +2173,7 @@ public void onPageStarted( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull String urlArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2443,7 +2188,7 @@ public void onPageFinished( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull String urlArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2459,7 +2204,7 @@ public void onReceivedHttpError( @NonNull Long webViewInstanceIdArg, @NonNull WebResourceRequestData requestArg, @NonNull WebResourceResponseData responseArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2476,7 +2221,7 @@ public void onReceivedRequestError( @NonNull Long webViewInstanceIdArg, @NonNull WebResourceRequestData requestArg, @NonNull WebResourceErrorData errorArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2494,7 +2239,7 @@ public void onReceivedError( @NonNull Long errorCodeArg, @NonNull String descriptionArg, @NonNull String failingUrlArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2515,7 +2260,7 @@ public void requestLoading( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull WebResourceRequestData requestArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2530,7 +2275,7 @@ public void urlLoading( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull String urlArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.WebViewClientFlutterApi.urlLoading", getCodec()); @@ -2545,14 +2290,15 @@ public interface DownloadListenerHostApi { void create(@NonNull Long instanceId); /** The codec used by DownloadListenerHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `DownloadListenerHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, DownloadListenerHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable DownloadListenerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2561,16 +2307,12 @@ static void setup(BinaryMessenger binaryMessenger, DownloadListenerHostApi api) channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.create((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2584,18 +2326,19 @@ static void setup(BinaryMessenger binaryMessenger, DownloadListenerHostApi api) } /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class DownloadListenerFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public DownloadListenerFlutterApi(BinaryMessenger argBinaryMessenger) { + public DownloadListenerFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by DownloadListenerFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } @@ -2606,7 +2349,7 @@ public void onDownloadStart( @NonNull String contentDispositionArg, @NonNull String mimetypeArg, @NonNull Long contentLengthArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2633,14 +2376,15 @@ void setSynchronousReturnValueForOnShowFileChooser( @NonNull Long instanceId, @NonNull Boolean value); /** The codec used by WebChromeClientHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `WebChromeClientHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable WebChromeClientHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2649,16 +2393,12 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.create((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2678,21 +2418,14 @@ static void setup(BinaryMessenger binaryMessenger, WebChromeClientHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); + Boolean valueArg = (Boolean) args.get(1); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } - Boolean valueArg = (Boolean) args.get(1); - if (valueArg == null) { - throw new NullPointerException("valueArg unexpectedly null."); - } api.setSynchronousReturnValueForOnShowFileChooser( (instanceIdArg == null) ? null : instanceIdArg.longValue(), valueArg); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2714,14 +2447,15 @@ public interface FlutterAssetManagerHostApi { String getAssetFilePathByName(@NonNull String name); /** The codec used by FlutterAssetManagerHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `FlutterAssetManagerHostApi` to handle messages through the * `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi api) { + static void setup( + @NonNull BinaryMessenger binaryMessenger, @Nullable FlutterAssetManagerHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2730,16 +2464,12 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String pathArg = (String) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - String pathArg = (String) args.get(0); - if (pathArg == null) { - throw new NullPointerException("pathArg unexpectedly null."); - } List output = api.list(pathArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2759,16 +2489,12 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String nameArg = (String) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - String nameArg = (String) args.get(0); - if (nameArg == null) { - throw new NullPointerException("nameArg unexpectedly null."); - } String output = api.getAssetFilePathByName(nameArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2782,18 +2508,19 @@ static void setup(BinaryMessenger binaryMessenger, FlutterAssetManagerHostApi ap } /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class WebChromeClientFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public WebChromeClientFlutterApi(BinaryMessenger argBinaryMessenger) { + public WebChromeClientFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by WebChromeClientFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } @@ -2801,7 +2528,7 @@ public void onProgressChanged( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull Long progressArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2816,7 +2543,7 @@ public void onShowFileChooser( @NonNull Long instanceIdArg, @NonNull Long webViewInstanceIdArg, @NonNull Long paramsInstanceIdArg, - Reply> callback) { + @NonNull Reply> callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, @@ -2840,13 +2567,13 @@ public interface WebStorageHostApi { void deleteAllData(@NonNull Long instanceId); /** The codec used by WebStorageHostApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return new StandardMessageCodec(); } /** * Sets up an instance of `WebStorageHostApi` to handle messages through the `binaryMessenger`. */ - static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { + static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable WebStorageHostApi api) { { BasicMessageChannel channel = new BasicMessageChannel<>( @@ -2855,16 +2582,12 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.create((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2882,16 +2605,12 @@ static void setup(BinaryMessenger binaryMessenger, WebStorageHostApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number instanceIdArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number instanceIdArg = (Number) args.get(0); - if (instanceIdArg == null) { - throw new NullPointerException("instanceIdArg unexpectedly null."); - } api.deleteAllData((instanceIdArg == null) ? null : instanceIdArg.longValue()); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -2940,18 +2659,19 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { *

Generated class from Pigeon that represents Flutter messages that can be called from Java. */ public static class FileChooserParamsFlutterApi { - private final BinaryMessenger binaryMessenger; + private final @NonNull BinaryMessenger binaryMessenger; - public FileChooserParamsFlutterApi(BinaryMessenger argBinaryMessenger) { + public FileChooserParamsFlutterApi(@NonNull BinaryMessenger argBinaryMessenger) { this.binaryMessenger = argBinaryMessenger; } /** Public interface for sending reply. */ + @SuppressWarnings("UnknownNullness") public interface Reply { void reply(T reply); } /** The codec used by FileChooserParamsFlutterApi. */ - static MessageCodec getCodec() { + static @NonNull MessageCodec getCodec() { return FileChooserParamsFlutterApiCodec.INSTANCE; } @@ -2961,7 +2681,7 @@ public void create( @NonNull List acceptTypesArg, @NonNull FileChooserModeEnumData modeArg, @Nullable String filenameHintArg, - Reply callback) { + @NonNull Reply callback) { BasicMessageChannel channel = new BasicMessageChannel<>( binaryMessenger, "dev.flutter.pigeon.FileChooserParamsFlutterApi.create", getCodec()); diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart index 557726a797e..bbf4d2359fa 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.g.dart @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.0.5), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index e255266c745..fea81af8fa9 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -29,4 +29,4 @@ dev_dependencies: flutter_test: sdk: flutter mockito: 5.4.0 - pigeon: ^9.0.5 + pigeon: ^9.2.4 diff --git a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart index 33ab0ecabca..6b0c31ab1c1 100644 --- a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart +++ b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.g.dart @@ -1,7 +1,7 @@ // 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. -// Autogenerated from Pigeon (v9.0.5), do not edit directly. +// Autogenerated from Pigeon (v9.2.4), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import // ignore_for_file: avoid_relative_lib_imports @@ -15,6 +15,8 @@ import 'package:webview_flutter_android/src/android_webview.g.dart'; /// Host API for managing the native `InstanceManager`. abstract class TestInstanceManagerHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); /// Clear the native `InstanceManager`. @@ -29,9 +31,12 @@ abstract class TestInstanceManagerHostApi { 'dev.flutter.pigeon.InstanceManagerHostApi.clear', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { // ignore message api.clear(); return []; @@ -47,6 +52,8 @@ abstract class TestInstanceManagerHostApi { /// /// See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html. abstract class TestJavaObjectHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void dispose(int identifier); @@ -58,9 +65,12 @@ abstract class TestJavaObjectHostApi { 'dev.flutter.pigeon.JavaObjectHostApi.dispose', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.JavaObjectHostApi.dispose was null.'); final List args = (message as List?)!; @@ -99,6 +109,8 @@ class _TestWebViewHostApiCodec extends StandardMessageCodec { } abstract class TestWebViewHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = _TestWebViewHostApiCodec(); void create(int instanceId); @@ -162,9 +174,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.create was null.'); final List args = (message as List?)!; @@ -181,9 +196,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.loadData', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadData was null.'); final List args = (message as List?)!; @@ -205,9 +223,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.loadDataWithBaseUrl', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadDataWithBaseUrl was null.'); final List args = (message as List?)!; @@ -232,9 +253,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.loadUrl', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.loadUrl was null.'); final List args = (message as List?)!; @@ -258,9 +282,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.postUrl', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.postUrl was null.'); final List args = (message as List?)!; @@ -283,9 +310,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.getUrl', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getUrl was null.'); final List args = (message as List?)!; @@ -302,9 +332,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.canGoBack', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoBack was null.'); final List args = (message as List?)!; @@ -321,9 +354,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.canGoForward', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.canGoForward was null.'); final List args = (message as List?)!; @@ -340,9 +376,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.goBack', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goBack was null.'); final List args = (message as List?)!; @@ -359,9 +398,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.goForward', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.goForward was null.'); final List args = (message as List?)!; @@ -378,9 +420,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.reload', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.reload was null.'); final List args = (message as List?)!; @@ -397,9 +442,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.clearCache', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.clearCache was null.'); final List args = (message as List?)!; @@ -419,9 +467,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.evaluateJavascript', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.evaluateJavascript was null.'); final List args = (message as List?)!; @@ -442,9 +493,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.getTitle', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getTitle was null.'); final List args = (message as List?)!; @@ -461,9 +515,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.scrollTo', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollTo was null.'); final List args = (message as List?)!; @@ -486,9 +543,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.scrollBy', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.scrollBy was null.'); final List args = (message as List?)!; @@ -511,9 +571,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.getScrollX', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollX was null.'); final List args = (message as List?)!; @@ -530,9 +593,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.getScrollY', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollY was null.'); final List args = (message as List?)!; @@ -549,9 +615,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.getScrollPosition', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.getScrollPosition was null.'); final List args = (message as List?)!; @@ -569,9 +638,12 @@ abstract class TestWebViewHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebContentsDebuggingEnabled was null.'); final List args = (message as List?)!; @@ -588,9 +660,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.setWebViewClient', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebViewClient was null.'); final List args = (message as List?)!; @@ -610,9 +685,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.addJavaScriptChannel was null.'); final List args = (message as List?)!; @@ -633,9 +711,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.removeJavaScriptChannel was null.'); final List args = (message as List?)!; @@ -656,9 +737,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.setDownloadListener', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setDownloadListener was null.'); final List args = (message as List?)!; @@ -676,9 +760,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.setWebChromeClient', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setWebChromeClient was null.'); final List args = (message as List?)!; @@ -696,9 +783,12 @@ abstract class TestWebViewHostApi { 'dev.flutter.pigeon.WebViewHostApi.setBackgroundColor', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewHostApi.setBackgroundColor was null.'); final List args = (message as List?)!; @@ -717,6 +807,8 @@ abstract class TestWebViewHostApi { } abstract class TestWebSettingsHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId, int webViewInstanceId); @@ -754,9 +846,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.create was null.'); final List args = (message as List?)!; @@ -776,9 +871,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDomStorageEnabled was null.'); final List args = (message as List?)!; @@ -799,9 +897,12 @@ abstract class TestWebSettingsHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptCanOpenWindowsAutomatically was null.'); final List args = (message as List?)!; @@ -823,9 +924,12 @@ abstract class TestWebSettingsHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportMultipleWindows was null.'); final List args = (message as List?)!; @@ -845,9 +949,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setJavaScriptEnabled was null.'); final List args = (message as List?)!; @@ -867,9 +974,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUserAgentString was null.'); final List args = (message as List?)!; @@ -888,9 +998,12 @@ abstract class TestWebSettingsHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setMediaPlaybackRequiresUserGesture was null.'); final List args = (message as List?)!; @@ -911,9 +1024,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setSupportZoom was null.'); final List args = (message as List?)!; @@ -934,9 +1050,12 @@ abstract class TestWebSettingsHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setLoadWithOverviewMode was null.'); final List args = (message as List?)!; @@ -956,9 +1075,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setUseWideViewPort was null.'); final List args = (message as List?)!; @@ -978,9 +1100,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setDisplayZoomControls was null.'); final List args = (message as List?)!; @@ -1000,9 +1125,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setBuiltInZoomControls was null.'); final List args = (message as List?)!; @@ -1022,9 +1150,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setAllowFileAccess', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setAllowFileAccess was null.'); final List args = (message as List?)!; @@ -1044,9 +1175,12 @@ abstract class TestWebSettingsHostApi { 'dev.flutter.pigeon.WebSettingsHostApi.setTextZoom', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebSettingsHostApi.setTextZoom was null.'); final List args = (message as List?)!; @@ -1065,6 +1199,8 @@ abstract class TestWebSettingsHostApi { } abstract class TestJavaScriptChannelHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId, String channelName); @@ -1076,9 +1212,12 @@ abstract class TestJavaScriptChannelHostApi { 'dev.flutter.pigeon.JavaScriptChannelHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.JavaScriptChannelHostApi.create was null.'); final List args = (message as List?)!; @@ -1097,6 +1236,8 @@ abstract class TestJavaScriptChannelHostApi { } abstract class TestWebViewClientHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId); @@ -1111,9 +1252,12 @@ abstract class TestWebViewClientHostApi { 'dev.flutter.pigeon.WebViewClientHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null.'); final List args = (message as List?)!; @@ -1131,9 +1275,12 @@ abstract class TestWebViewClientHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading was null.'); final List args = (message as List?)!; @@ -1153,6 +1300,8 @@ abstract class TestWebViewClientHostApi { } abstract class TestDownloadListenerHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId); @@ -1164,9 +1313,12 @@ abstract class TestDownloadListenerHostApi { 'dev.flutter.pigeon.DownloadListenerHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.DownloadListenerHostApi.create was null.'); final List args = (message as List?)!; @@ -1182,6 +1334,8 @@ abstract class TestDownloadListenerHostApi { } abstract class TestWebChromeClientHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId); @@ -1196,9 +1350,12 @@ abstract class TestWebChromeClientHostApi { 'dev.flutter.pigeon.WebChromeClientHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.create was null.'); final List args = (message as List?)!; @@ -1216,9 +1373,12 @@ abstract class TestWebChromeClientHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebChromeClientHostApi.setSynchronousReturnValueForOnShowFileChooser was null.'); final List args = (message as List?)!; @@ -1238,6 +1398,8 @@ abstract class TestWebChromeClientHostApi { } abstract class TestAssetManagerHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); List list(String path); @@ -1251,9 +1413,12 @@ abstract class TestAssetManagerHostApi { 'dev.flutter.pigeon.FlutterAssetManagerHostApi.list', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.FlutterAssetManagerHostApi.list was null.'); final List args = (message as List?)!; @@ -1271,9 +1436,12 @@ abstract class TestAssetManagerHostApi { codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.FlutterAssetManagerHostApi.getAssetFilePathByName was null.'); final List args = (message as List?)!; @@ -1289,6 +1457,8 @@ abstract class TestAssetManagerHostApi { } abstract class TestWebStorageHostApi { + static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => + TestDefaultBinaryMessengerBinding.instance; static const MessageCodec codec = StandardMessageCodec(); void create(int instanceId); @@ -1302,9 +1472,12 @@ abstract class TestWebStorageHostApi { 'dev.flutter.pigeon.WebStorageHostApi.create', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebStorageHostApi.create was null.'); final List args = (message as List?)!; @@ -1321,9 +1494,12 @@ abstract class TestWebStorageHostApi { 'dev.flutter.pigeon.WebStorageHostApi.deleteAllData', codec, binaryMessenger: binaryMessenger); if (api == null) { - channel.setMockMessageHandler(null); + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); } else { - channel.setMockMessageHandler((Object? message) async { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { assert(message != null, 'Argument for dev.flutter.pigeon.WebStorageHostApi.deleteAllData was null.'); final List args = (message as List?)!;