Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
OnPageError V4
Signed-off-by: Hugo Olthof <[email protected]>
  • Loading branch information
HugoOlthof committed Apr 12, 2023
commit 63498b0f96a86f62cdca2d2bc1efd5bb97fb32a7
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ class _WebViewExampleState extends State<WebViewExample> {
onPageFinished: (String url) {
debugPrint('Page finished loading: $url');
},
onPageError: (int statusCode) {
debugPrint('Error occured on page: $statusCode');
},
onWebResourceError: (WebResourceError error) {
debugPrint('''
Page resource error:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class _WebViewExampleState extends State<WebViewExample> {
},
onPageStarted: (String url) {},
onPageFinished: (String url) {},
onPageError: (int statusCode) {},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('https://www.youtube.com/')) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ class FakeNavigationDelegate extends PlatformNavigationDelegate {
@override
Future<void> setOnPageStarted(PageEventCallback onPageStarted) async {}

@override
Future<void> setOnPageError(PageErrorCallback onPageStarted) async {}

@override
Future<void> setOnProgress(ProgressCallback onProgress) async {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +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(WebResourceError error)? onWebResourceError,
}) : this.fromPlatformCreationParams(
const PlatformNavigationDelegateCreationParams(),
onNavigationRequest: onNavigationRequest,
onPageStarted: onPageStarted,
onPageFinished: onPageFinished,
onPageError: onPageError,
onProgress: onProgress,
onWebResourceError: onWebResourceError,
);
Expand Down Expand Up @@ -87,13 +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(WebResourceError error)? onWebResourceError,
}) : this.fromPlatform(
PlatformNavigationDelegate(params),
onNavigationRequest: onNavigationRequest,
onPageStarted: onPageStarted,
onPageFinished: onPageFinished,
onPageError: onPageError,
onProgress: onProgress,
onWebResourceError: onWebResourceError,
);
Expand All @@ -104,6 +108,7 @@ class NavigationDelegate {
this.onNavigationRequest,
this.onPageStarted,
this.onPageFinished,
this.onPageError,
this.onProgress,
this.onWebResourceError,
}) {
Expand All @@ -116,6 +121,9 @@ class NavigationDelegate {
if (onPageFinished != null) {
platform.setOnPageFinished(onPageFinished!);
}
if (onPageError != null) {
platform.setOnPageError(onPageError!);
}
if (onProgress != null) {
platform.setOnProgress(onProgress!);
}
Expand Down Expand Up @@ -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;

Expand Down
9 changes: 6 additions & 3 deletions packages/webview_flutter/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock
returnValueForMissingStub: _i8.Future<void>.value(),
) as _i8.Future<void>);
@override
_i8.Future<void> setOnPageError(_i3.PageErrorCallback? onPageError) =>
(super.noSuchMethod(
Invocation.method(
#setOnPageError,
[onPageError],
),
returnValue: _i8.Future<void>.value(),
returnValueForMissingStub: _i8.Future<void>.value(),
) as _i8.Future<void>);
@override
_i8.Future<void> setOnProgress(_i3.ProgressCallback? onProgress) =>
(super.noSuchMethod(
Invocation.method(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> setOnPageError(_i6.PageErrorCallback? onPageError) =>
(super.noSuchMethod(
Invocation.method(
#setOnPageError,
[onPageError],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> setOnProgress(_i6.ProgressCallback? onProgress) =>
(super.noSuchMethod(
Invocation.method(
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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<Void> 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 -> {});
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ class _WebViewExampleState extends State<WebViewExample> {
..setOnPageFinished((String url) {
debugPrint('Page finished loading: $url');
})
..setOnPageError((int statusCode) {
debugPrint('Error occured on page: $statusCode');
})
..setOnWebResourceError((WebResourceError error) {
debugPrint('''
Page resource error:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -863,6 +871,7 @@ class WebViewClient extends JavaObject {
return WebViewClient.detached(
onPageStarted: onPageStarted,
onPageFinished: onPageFinished,
onPageError: onPageError,
onReceivedRequestError: onReceivedRequestError,
onReceivedError: onReceivedError,
requestLoading: requestLoading,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -829,6 +834,7 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate {

PageEventCallback? _onPageFinished;
PageEventCallback? _onPageStarted;
PageErrorCallback? _onPageError;
ProgressCallback? _onProgress;
WebResourceErrorCallback? _onWebResourceError;
NavigationRequestCallback? _onNavigationRequest;
Expand Down Expand Up @@ -900,6 +906,13 @@ class AndroidNavigationDelegate extends PlatformNavigationDelegate {
_onPageFinished = onPageFinished;
}

@override
Future<void> setOnPageError(
PageErrorCallback onPageError,
) async {
_onPageError = onPageError;
}

@override
Future<void> setOnProgress(
ProgressCallback onProgress,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -467,6 +483,7 @@ class CapturingWebViewClient extends android_webview.WebViewClient {
CapturingWebViewClient({
super.onPageFinished,
super.onPageStarted,
super.onPageError,
super.onReceivedError,
super.onReceivedRequestError,
super.requestLoading,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading