Skip to content
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