Skip to content

[webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel #8776

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Mar 31, 2025
Merged
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 3.18.5

* Fixes crash when sending undefined message via JavaScript channel.

## 3.18.4

* Fixes crash when native `WKFrameInfo.request` is nil.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,47 @@ Future<void> main() async {
await expectLater(channelCompleter.future, completion('hello'));
});

testWidgets('JavaScriptChannel can receive undefined',
(WidgetTester tester) async {
final Completer<void> pageFinished = Completer<void>();
final PlatformWebViewController controller = PlatformWebViewController(
const PlatformWebViewControllerCreationParams(),
);
unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted));
final PlatformNavigationDelegate delegate = PlatformNavigationDelegate(
const PlatformNavigationDelegateCreationParams(),
);
unawaited(delegate.setOnPageFinished((_) => pageFinished.complete()));
unawaited(controller.setPlatformNavigationDelegate(delegate));

final Completer<String> channelCompleter = Completer<String>();
await controller.addJavaScriptChannel(
JavaScriptChannelParams(
name: 'Channel',
onMessageReceived: (JavaScriptMessage message) {
channelCompleter.complete(message.message);
},
),
);

await controller.loadHtmlString(
'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+',
);

await tester.pumpWidget(Builder(
builder: (BuildContext context) {
return PlatformWebViewWidget(
PlatformWebViewWidgetCreationParams(controller: controller),
).build(context);
},
));

await pageFinished.future;

await controller.runJavaScript('Channel.postMessage(undefined);');
await expectLater(channelCompleter.future, completion('(null)'));
});

testWidgets('resize webview', (WidgetTester tester) async {
final Completer<void> buttonTapResizeCompleter = Completer<void>();
final Completer<void> onPageFinished = Completer<void>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
/// ) {
/// weakReference.target?.onJavascriptChannelMessage(
/// message.name,
/// message.body!.toString(),
/// message.body.toString(),
/// );
/// };
/// },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ class WebKitWebViewPlatformController extends WebViewPlatformController {
) {
weakReference.target?.onJavascriptChannelMessage(
message.name,
message.body!.toString(),
message.body.toString(),
);
};
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -905,8 +905,13 @@ class WebKitJavaScriptChannelParams extends JavaScriptChannelParams {
(WeakReference<void Function(JavaScriptMessage)> weakReference) {
return (_, __, WKScriptMessage message) {
if (weakReference.target != null) {
// When message.body is null, return '(null)' for consistency
// with previous implementations.
weakReference.target!(
JavaScriptMessage(message: message.body!.toString()),
JavaScriptMessage(
message: message.body == null
? '(null)'
: message.body.toString()),
);
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
version: 3.18.4
version: 3.18.5

environment:
sdk: ^3.5.0
Expand Down