Skip to content

Commit 9b317eb

Browse files
[webview_flutter_wkebview] Verify JavaScriptChannels have a unique name (#5904)
Fixes flutter/flutter#141242 According to [WKUserContentController.addScriptMessageHandler](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-addscriptmessagehandler?language=objc), a handler must have a unique name. In flutter/flutter#141242, this led to a crash. This PR prevents the app crash and throws an error from Dart when the method is called.
1 parent d848050 commit 9b317eb

File tree

4 files changed

+50
-2
lines changed

4 files changed

+50
-2
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
## NEXT
1+
## 3.10.3
22

3+
* Adds a check that throws an `ArgumentError` when `WebKitWebViewController.addJavaScriptChannel`
4+
receives a `JavaScriptChannelParams` with a name that is not unique.
35
* Updates minimum iOS version to 12.0 and minimum Flutter version to 3.16.6.
46

57
## 3.10.2

lib/src/webkit_webview_controller.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@ class WebKitWebViewController extends PlatformWebViewController {
326326
Future<void> addJavaScriptChannel(
327327
JavaScriptChannelParams javaScriptChannelParams,
328328
) {
329+
final String channelName = javaScriptChannelParams.name;
330+
if (_javaScriptChannelParams.containsKey(channelName)) {
331+
throw ArgumentError(
332+
'A JavaScriptChannel with name `$channelName` already exists.',
333+
);
334+
}
335+
329336
final WebKitJavaScriptChannelParams webKitParams =
330337
javaScriptChannelParams is WebKitJavaScriptChannelParams
331338
? javaScriptChannelParams

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.10.2
5+
version: 3.10.3
66

77
environment:
88
sdk: ^3.2.3

test/webkit_webview_controller_test.dart

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,45 @@ void main() {
756756
);
757757
});
758758

759+
test('addJavaScriptChannel requires channel with a unique name', () async {
760+
final WebKitProxy webKitProxy = WebKitProxy(
761+
createScriptMessageHandler: ({
762+
required void Function(
763+
WKUserContentController userContentController,
764+
WKScriptMessage message,
765+
) didReceiveScriptMessage,
766+
}) {
767+
return WKScriptMessageHandler.detached(
768+
didReceiveScriptMessage: didReceiveScriptMessage,
769+
);
770+
},
771+
);
772+
final MockWKUserContentController mockUserContentController =
773+
MockWKUserContentController();
774+
final WebKitWebViewController controller = createControllerWithMocks(
775+
mockUserContentController: mockUserContentController,
776+
);
777+
778+
const String nonUniqueName = 'name';
779+
final WebKitJavaScriptChannelParams javaScriptChannelParams =
780+
WebKitJavaScriptChannelParams(
781+
name: nonUniqueName,
782+
onMessageReceived: (JavaScriptMessage message) {},
783+
webKitProxy: webKitProxy,
784+
);
785+
await controller.addJavaScriptChannel(javaScriptChannelParams);
786+
787+
expect(
788+
() => controller.addJavaScriptChannel(
789+
JavaScriptChannelParams(
790+
name: nonUniqueName,
791+
onMessageReceived: (_) {},
792+
),
793+
),
794+
throwsArgumentError,
795+
);
796+
});
797+
759798
test('removeJavaScriptChannel', () async {
760799
final WebKitProxy webKitProxy = WebKitProxy(
761800
createScriptMessageHandler: ({

0 commit comments

Comments
 (0)