diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 403c760d267c..04fbf5a81ac9 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.23.7 + +* Fixes crash when calling setOnConsoleMessage multiple times. + ## 3.23.6 * Fixes a crash if WebViewFlutterWKWebViewExternalAPI is passed the wrong registry. 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 6eda612ef31b..8c7ef34cd325 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 @@ -700,7 +700,7 @@ class WebKitWebViewController extends PlatformWebViewController { @override Future setOnConsoleMessage( void Function(JavaScriptConsoleMessage consoleMessage) onConsoleMessage, - ) { + ) async { _onConsoleMessageCallback = onConsoleMessage; final JavaScriptChannelParams channelParams = WebKitJavaScriptChannelParams( @@ -736,7 +736,12 @@ class WebKitWebViewController extends PlatformWebViewController { }, ); - addJavaScriptChannel(channelParams); + // If fltConsoleMessage is already present, the callback is already registered. + if (_javaScriptChannelParams.containsKey('fltConsoleMessage')) { + return; + } + + await addJavaScriptChannel(channelParams); return _injectConsoleOverride(); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 9678b60179c2..5439ee7a5fb1 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.23.6 +version: 3.23.7 environment: sdk: ^3.9.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 579e84a22332..3ec193176958 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 @@ -1815,6 +1815,26 @@ window.addEventListener("error", function(e) { expect(logs[JavaScriptLogLevel.log], 'Log message'); expect(logs[JavaScriptLogLevel.warning], 'Warning message'); }); + + test('setOnConsoleMessage called twice does not throw', () async { + final mockUserContentController = MockWKUserContentController(); + final WebKitWebViewController controller = createControllerWithMocks( + mockUserContentController: mockUserContentController, + ); + + await controller.setOnConsoleMessage( + (JavaScriptConsoleMessage message) {}, + ); + await controller.setOnConsoleMessage( + (JavaScriptConsoleMessage message) {}, + ); + + verifyNever( + mockUserContentController.removeScriptMessageHandler( + 'fltConsoleMessage', + ), + ); + }); }); test('setOnCanGoBackChange', () async {