Skip to content

Commit 7b31262

Browse files
authored
[webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel (#8776)
Fixes flutter/flutter#162352
1 parent 6d761bf commit 7b31262

File tree

6 files changed

+54
-4
lines changed

6 files changed

+54
-4
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.18.5
2+
3+
* Fixes crash when sending undefined message via JavaScript channel.
4+
15
## 3.18.4
26

37
* Fixes crash when native `WKFrameInfo.request` is nil.

packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,47 @@ Future<void> main() async {
278278
await expectLater(channelCompleter.future, completion('hello'));
279279
});
280280

281+
testWidgets('JavaScriptChannel can receive undefined',
282+
(WidgetTester tester) async {
283+
final Completer<void> pageFinished = Completer<void>();
284+
final PlatformWebViewController controller = PlatformWebViewController(
285+
const PlatformWebViewControllerCreationParams(),
286+
);
287+
unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted));
288+
final PlatformNavigationDelegate delegate = PlatformNavigationDelegate(
289+
const PlatformNavigationDelegateCreationParams(),
290+
);
291+
unawaited(delegate.setOnPageFinished((_) => pageFinished.complete()));
292+
unawaited(controller.setPlatformNavigationDelegate(delegate));
293+
294+
final Completer<String> channelCompleter = Completer<String>();
295+
await controller.addJavaScriptChannel(
296+
JavaScriptChannelParams(
297+
name: 'Channel',
298+
onMessageReceived: (JavaScriptMessage message) {
299+
channelCompleter.complete(message.message);
300+
},
301+
),
302+
);
303+
304+
await controller.loadHtmlString(
305+
'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+',
306+
);
307+
308+
await tester.pumpWidget(Builder(
309+
builder: (BuildContext context) {
310+
return PlatformWebViewWidget(
311+
PlatformWebViewWidgetCreationParams(controller: controller),
312+
).build(context);
313+
},
314+
));
315+
316+
await pageFinished.future;
317+
318+
await controller.runJavaScript('Channel.postMessage(undefined);');
319+
await expectLater(channelCompleter.future, completion('(null)'));
320+
});
321+
281322
testWidgets('resize webview', (WidgetTester tester) async {
282323
final Completer<void> buttonTapResizeCompleter = Completer<void>();
283324
final Completer<void> onPageFinished = Completer<void>();

packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// ) {
1919
/// weakReference.target?.onJavascriptChannelMessage(
2020
/// message.name,
21-
/// message.body!.toString(),
21+
/// message.body.toString(),
2222
/// );
2323
/// };
2424
/// },

packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ class WebKitWebViewPlatformController extends WebViewPlatformController {
456456
) {
457457
weakReference.target?.onJavascriptChannelMessage(
458458
message.name,
459-
message.body!.toString(),
459+
message.body.toString(),
460460
);
461461
};
462462
},

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,8 +905,13 @@ class WebKitJavaScriptChannelParams extends JavaScriptChannelParams {
905905
(WeakReference<void Function(JavaScriptMessage)> weakReference) {
906906
return (_, __, WKScriptMessage message) {
907907
if (weakReference.target != null) {
908+
// When message.body is null, return '(null)' for consistency
909+
// with previous implementations.
908910
weakReference.target!(
909-
JavaScriptMessage(message: message.body!.toString()),
911+
JavaScriptMessage(
912+
message: message.body == null
913+
? '(null)'
914+
: message.body.toString()),
910915
);
911916
}
912917
};

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.18.4
5+
version: 3.18.5
66

77
environment:
88
sdk: ^3.5.0

0 commit comments

Comments
 (0)