From f9bf1251817a8a623a1859e7e1d78120512a6a4a Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:08:27 -0500 Subject: [PATCH 1/2] verify unique name --- .../webview_flutter_wkwebview/CHANGELOG.md | 5 +++ .../lib/src/webkit_webview_controller.dart | 7 ++++ .../webview_flutter_wkwebview/pubspec.yaml | 2 +- .../test/webkit_webview_controller_test.dart | 39 +++++++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index b1b16abfd89..9b56f4f8a13 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.10.3 + +* Adds a check that throws an `ArgumentError` when `WebKitWebViewController.addJavaScriptChannel` + receives a `JavaScriptChannelParams` with a name that is not unique. + ## 3.10.2 * Adds privacy manifest. 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 6c28becacde..47d41a05031 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` has already been added.', + ); + } + 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 9f467dece2b..9664c705c32 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.0.0 <4.0.0" 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 0bada4087ff..79f34f378de 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: ({ From 8018c6170e616368dd63f93faf636a4904d62c03 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:04:26 -0500 Subject: [PATCH 2/2] improve error message --- .../lib/src/webkit_webview_controller.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 47d41a05031..357ab94acdd 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 @@ -329,7 +329,7 @@ class WebKitWebViewController extends PlatformWebViewController { final String channelName = javaScriptChannelParams.name; if (_javaScriptChannelParams.containsKey(channelName)) { throw ArgumentError( - 'A JavaScriptChannel with name `$channelName` has already been added.', + 'A JavaScriptChannel with name `$channelName` already exists.', ); }