diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index cfcf3d8385c9..5a97e3e88f49 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,5 +1,7 @@ -## NEXT +## 3.10.3 +* Adds a check that throws an `ArgumentError` when `WebKitWebViewController.addJavaScriptChannel` + receives a `JavaScriptChannelParams` with a name that is not unique. * Updates minimum iOS version to 12.0 and minimum Flutter version to 3.16.6. ## 3.10.2 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index 6c28becacdeb..357ab94acdd1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -326,6 +326,13 @@ class WebKitWebViewController extends PlatformWebViewController { Future addJavaScriptChannel( JavaScriptChannelParams javaScriptChannelParams, ) { + final String channelName = javaScriptChannelParams.name; + if (_javaScriptChannelParams.containsKey(channelName)) { + throw ArgumentError( + 'A JavaScriptChannel with name `$channelName` already exists.', + ); + } + final WebKitJavaScriptChannelParams webKitParams = javaScriptChannelParams is WebKitJavaScriptChannelParams ? javaScriptChannelParams diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 237a68e6b004..572f1d8b4919 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -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.10.2 +version: 3.10.3 environment: sdk: ^3.2.3 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index 0bada4087ff3..79f34f378dee 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -756,6 +756,45 @@ void main() { ); }); + test('addJavaScriptChannel requires channel with a unique name', () async { + final WebKitProxy webKitProxy = WebKitProxy( + createScriptMessageHandler: ({ + required void Function( + WKUserContentController userContentController, + WKScriptMessage message, + ) didReceiveScriptMessage, + }) { + return WKScriptMessageHandler.detached( + didReceiveScriptMessage: didReceiveScriptMessage, + ); + }, + ); + final MockWKUserContentController mockUserContentController = + MockWKUserContentController(); + final WebKitWebViewController controller = createControllerWithMocks( + mockUserContentController: mockUserContentController, + ); + + const String nonUniqueName = 'name'; + final WebKitJavaScriptChannelParams javaScriptChannelParams = + WebKitJavaScriptChannelParams( + name: nonUniqueName, + onMessageReceived: (JavaScriptMessage message) {}, + webKitProxy: webKitProxy, + ); + await controller.addJavaScriptChannel(javaScriptChannelParams); + + expect( + () => controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: nonUniqueName, + onMessageReceived: (_) {}, + ), + ), + throwsArgumentError, + ); + }); + test('removeJavaScriptChannel', () async { final WebKitProxy webKitProxy = WebKitProxy( createScriptMessageHandler: ({