Skip to content

Commit 6e9258f

Browse files
[webview_flutter_wkwebview] Fixes an exception caused by the onUrlChange callback returning a null url (#3848)
While investigating another bug, I realized that loading the initial request with an invalid url, the callback returns a null NSURL.
1 parent 96fd7c8 commit 6e9258f

File tree

4 files changed

+57
-3
lines changed

4 files changed

+57
-3
lines changed

packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 3.4.2
2+
3+
* Fixes an exception caused by the `onUrlChange` callback passing a null `NSUrl`.
4+
15
## 3.4.1
26

37
* Fixes internal type conversion error.

packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ class WebKitWebViewController extends PlatformWebViewController {
239239
final UrlChangeCallback? urlChangeCallback =
240240
controller._currentNavigationDelegate?._onUrlChange;
241241
if (urlChangeCallback != null) {
242-
final NSUrl url = change[NSKeyValueChangeKey.newValue]! as NSUrl;
243-
urlChangeCallback(UrlChange(url: await url.getAbsoluteString()));
242+
final NSUrl? url = change[NSKeyValueChangeKey.newValue] as NSUrl?;
243+
urlChangeCallback(UrlChange(url: await url?.getAbsoluteString()));
244244
}
245245
break;
246246
}

packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_wkwebview
22
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
33
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 3.4.1
5+
version: 3.4.2
66

77
environment:
88
sdk: ">=2.18.0 <4.0.0"

packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,56 @@ void main() {
10361036
expect(urlChange.url, 'https://www.google.com');
10371037
});
10381038

1039+
test('setPlatformNavigationDelegate onUrlChange to null NSUrl', () async {
1040+
final MockWKWebView mockWebView = MockWKWebView();
1041+
1042+
late final void Function(
1043+
String keyPath,
1044+
NSObject object,
1045+
Map<NSKeyValueChangeKey, Object?> change,
1046+
) webViewObserveValue;
1047+
1048+
final WebKitWebViewController controller = createControllerWithMocks(
1049+
createMockWebView: (
1050+
_, {
1051+
void Function(
1052+
String keyPath,
1053+
NSObject object,
1054+
Map<NSKeyValueChangeKey, Object?> change,
1055+
)? observeValue,
1056+
}) {
1057+
webViewObserveValue = observeValue!;
1058+
return mockWebView;
1059+
},
1060+
);
1061+
1062+
final WebKitNavigationDelegate navigationDelegate =
1063+
WebKitNavigationDelegate(
1064+
const WebKitNavigationDelegateCreationParams(
1065+
webKitProxy: WebKitProxy(
1066+
createNavigationDelegate: CapturingNavigationDelegate.new,
1067+
createUIDelegate: WKUIDelegate.detached,
1068+
),
1069+
),
1070+
);
1071+
1072+
final Completer<UrlChange> urlChangeCompleter = Completer<UrlChange>();
1073+
navigationDelegate.setOnUrlChange(
1074+
(UrlChange change) => urlChangeCompleter.complete(change),
1075+
);
1076+
1077+
await controller.setPlatformNavigationDelegate(navigationDelegate);
1078+
1079+
webViewObserveValue(
1080+
'URL',
1081+
mockWebView,
1082+
<NSKeyValueChangeKey, Object?>{NSKeyValueChangeKey.newValue: null},
1083+
);
1084+
1085+
final UrlChange urlChange = await urlChangeCompleter.future;
1086+
expect(urlChange.url, isNull);
1087+
});
1088+
10391089
test('webViewIdentifier', () {
10401090
final InstanceManager instanceManager = InstanceManager(
10411091
onWeakReferenceRemoved: (_) {},

0 commit comments

Comments
 (0)