From 6abb6746eb1a532edf90eddb7b35d317586f8806 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Tue, 4 Mar 2025 11:13:59 +0800 Subject: [PATCH 01/10] Fixes crash when sending undefined message via javascript channel --- .../webview_flutter_wkwebview/CHANGELOG.md | 4 ++ .../webview_flutter_test.dart | 41 +++++++++++++++++++ .../lib/src/common/weak_reference_utils.dart | 2 +- .../lib/src/webkit_webview_controller.dart | 2 +- .../webview_flutter_wkwebview/pubspec.yaml | 2 +- 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 94ea0ff9f2a..3e4efd568c4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.18.4 + +* Fixes crash when sending undefined message via javascript channel. + ## 3.18.3 * Fixes crash where the native `AuthenticationChallengeResponse` could not be found for auth diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 24e70d775b1..71f6c666a36 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -278,6 +278,47 @@ Future main() async { await expectLater(channelCompleter.future, completion('hello')); }); + testWidgets('JavascriptChannel can receive undefined', + (WidgetTester tester) async { + final Completer pageFinished = Completer(); + final PlatformWebViewController controller = PlatformWebViewController( + const PlatformWebViewControllerCreationParams(), + ); + unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); + final PlatformNavigationDelegate delegate = PlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams(), + ); + unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); + unawaited(controller.setPlatformNavigationDelegate(delegate)); + + final Completer channelCompleter = Completer(); + await controller.addJavaScriptChannel( + JavaScriptChannelParams( + name: 'Channel', + onMessageReceived: (JavaScriptMessage message) { + channelCompleter.complete(message.message); + }, + ), + ); + + await controller.loadHtmlString( + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', + ); + + await tester.pumpWidget(Builder( + builder: (BuildContext context) { + return PlatformWebViewWidget( + PlatformWebViewWidgetCreationParams(controller: controller), + ).build(context); + }, + )); + + await pageFinished.future; + + await controller.runJavaScript('Channel.postMessage(undefined);'); + await expectLater(channelCompleter.future, completion('')); + }); + testWidgets('resize webview', (WidgetTester tester) async { final Completer buttonTapResizeCompleter = Completer(); final Completer onPageFinished = Completer(); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart index f12485ad6e7..e3aead42f13 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart @@ -18,7 +18,7 @@ /// ) { /// weakReference.target?.onJavascriptChannelMessage( /// message.name, -/// message.body!.toString(), +/// message.body?.toString() ?? '', /// ); /// }; /// }, 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 4bf9d87aedf..d43f1c0c53e 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 @@ -906,7 +906,7 @@ class WebKitJavaScriptChannelParams extends JavaScriptChannelParams { return (_, __, WKScriptMessage message) { if (weakReference.target != null) { weakReference.target!( - JavaScriptMessage(message: message.body!.toString()), + JavaScriptMessage(message: message.body?.toString() ?? ''), ); } }; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 518e0b3465c..5a0e7ed115a 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.18.3 +version: 3.18.4 environment: sdk: ^3.5.0 From 153a85cc8372b5dd39c127a373fb8a69fae2c3db Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 20 Mar 2025 23:20:48 -0400 Subject: [PATCH 02/10] javascript spelling --- packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 2 +- .../example/integration_test/webview_flutter_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 38ab1e044ac..a4ea405f961 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,6 +1,6 @@ ## 3.18.5 -* Fixes crash when sending undefined message via javascript channel. +* Fixes crash when sending undefined message via JavaScript channel. ## 3.18.4 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 71f6c666a36..5f67cfab257 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -278,7 +278,7 @@ Future main() async { await expectLater(channelCompleter.future, completion('hello')); }); - testWidgets('JavascriptChannel can receive undefined', + testWidgets('JavaScriptChannel can receive undefined', (WidgetTester tester) async { final Completer pageFinished = Completer(); final PlatformWebViewController controller = PlatformWebViewController( From 136205679dfe82d59d9925ba54a1daba089116c8 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 18:25:28 +0800 Subject: [PATCH 03/10] Preserve undefined and null output --- .../webview_flutter_test.dart | 11 +++-- .../lib/src/webkit_webview_controller.dart | 42 +++++++++++++++++++ .../test/webkit_webview_controller_test.dart | 4 +- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 5f67cfab257..2dc3155b776 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -278,7 +278,7 @@ Future main() async { await expectLater(channelCompleter.future, completion('hello')); }); - testWidgets('JavaScriptChannel can receive undefined', + testWidgets('JavaScriptChannel can receive undefined and null', (WidgetTester tester) async { final Completer pageFinished = Completer(); final PlatformWebViewController controller = PlatformWebViewController( @@ -291,12 +291,12 @@ Future main() async { unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); unawaited(controller.setPlatformNavigationDelegate(delegate)); - final Completer channelCompleter = Completer(); + final List messages = []; await controller.addJavaScriptChannel( JavaScriptChannelParams( name: 'Channel', onMessageReceived: (JavaScriptMessage message) { - channelCompleter.complete(message.message); + messages.add(message.message); }, ), ); @@ -316,7 +316,10 @@ Future main() async { await pageFinished.future; await controller.runJavaScript('Channel.postMessage(undefined);'); - await expectLater(channelCompleter.future, completion('')); + await controller.runJavaScript('Channel.postMessage(null);'); + + await tester.pumpAndSettle(); + expect(messages, ['undefined', 'null']); }); testWidgets('resize webview', (WidgetTester tester) async { 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 aca488ea9f9..81089b9e6e7 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 @@ -443,6 +443,7 @@ class WebKitWebViewController extends PlatformWebViewController { webKitParams.name, ), ]); + await _injectPostMessageOverride(webKitParams.name); } @override @@ -768,6 +769,47 @@ window.addEventListener("error", function(e) { await controller.addUserScript(overrideScript); } + Future _injectPostMessageOverride(String channelName) async { + final WKUserScript overrideScript = + _webKitParams.webKitProxy.newWKUserScript( + source: ''' +var _flutter_webview_plugin_overrides = _flutter_webview_plugin_overrides || {}; + +_flutter_webview_plugin_overrides.originalPostMessageFunctions = _flutter_webview_plugin_overrides.originalPostMessageFunctions || {}; + +(function() { + if (window.webkit && window.webkit.messageHandlers) { + const handlerName = "$channelName"; + const handler = window.webkit.messageHandlers[handlerName]; + + if (handler && + typeof handler.postMessage === 'function' && + !_flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName]) { + + _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName] = handler.postMessage; + + handler.postMessage = function(data) { + if (data === undefined) { + return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, "undefined"); + } + if (data === null) { + return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, "null"); + } + return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, data); + }; + } + } +})(); + ''', + injectionTime: UserScriptInjectionTime.atDocumentStart, + isForMainFrameOnly: false, + ); + + final WKUserContentController controller = + await _webView.configuration.getUserContentController(); + await controller.addUserScript(overrideScript); + } + // WKWebView does not support removing a single user script, so all user // scripts and all message handlers are removed instead. And the JavaScript // channels that shouldn't be removed are re-registered. Note that this 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 e6a350de4e6..c8240c2ae19 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 @@ -863,7 +863,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .single as WKUserScript; + .toList().first as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( userScript.injectionTime, @@ -1008,7 +1008,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .single as WKUserScript; + .toList().first as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( userScript.injectionTime, From 5c7801befbb1ace3ac1947740b5f26adba883351 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 18:50:52 +0800 Subject: [PATCH 04/10] Code formatting --- .../test/webkit_webview_controller_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 c8240c2ae19..94998a635f5 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 @@ -863,7 +863,8 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList().first as WKUserScript; + .toList() + .first as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( userScript.injectionTime, @@ -1008,7 +1009,8 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList().first as WKUserScript; + .toList() + .first as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( userScript.injectionTime, From 83b1aed2bc38e1b85b07064963885d40d8274df9 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 19:09:33 +0800 Subject: [PATCH 05/10] update --- .../test/webkit_webview_controller_test.dart | 2 -- 1 file changed, 2 deletions(-) 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 94998a635f5..edd6730946f 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 @@ -863,7 +863,6 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList() .first as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( @@ -1009,7 +1008,6 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList() .first as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( From feb84e291947433016e91a178d41b374c5a99675 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 23:49:25 +0800 Subject: [PATCH 06/10] Revert "update" This reverts commit 83b1aed2bc38e1b85b07064963885d40d8274df9. --- .../test/webkit_webview_controller_test.dart | 2 ++ 1 file changed, 2 insertions(+) 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 edd6730946f..94998a635f5 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 @@ -863,6 +863,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured + .toList() .first as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( @@ -1008,6 +1009,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured + .toList() .first as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( From 77bec509c5ecb884ed4dcdc1ffa449ace3cff7b5 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 23:49:31 +0800 Subject: [PATCH 07/10] Revert "Code formatting" This reverts commit 5c7801befbb1ace3ac1947740b5f26adba883351. --- .../test/webkit_webview_controller_test.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 94998a635f5..c8240c2ae19 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 @@ -863,8 +863,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList() - .first as WKUserScript; + .toList().first as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( userScript.injectionTime, @@ -1009,8 +1008,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList() - .first as WKUserScript; + .toList().first as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( userScript.injectionTime, From db6b43a807fa9b405d741caf30031b5ee3bb464e Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Mon, 24 Mar 2025 23:49:42 +0800 Subject: [PATCH 08/10] Revert "Preserve undefined and null output" This reverts commit 136205679dfe82d59d9925ba54a1daba089116c8. --- .../webview_flutter_test.dart | 11 ++--- .../lib/src/webkit_webview_controller.dart | 42 ------------------- .../test/webkit_webview_controller_test.dart | 4 +- 3 files changed, 6 insertions(+), 51 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 2dc3155b776..5f67cfab257 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -278,7 +278,7 @@ Future main() async { await expectLater(channelCompleter.future, completion('hello')); }); - testWidgets('JavaScriptChannel can receive undefined and null', + testWidgets('JavaScriptChannel can receive undefined', (WidgetTester tester) async { final Completer pageFinished = Completer(); final PlatformWebViewController controller = PlatformWebViewController( @@ -291,12 +291,12 @@ Future main() async { unawaited(delegate.setOnPageFinished((_) => pageFinished.complete())); unawaited(controller.setPlatformNavigationDelegate(delegate)); - final List messages = []; + final Completer channelCompleter = Completer(); await controller.addJavaScriptChannel( JavaScriptChannelParams( name: 'Channel', onMessageReceived: (JavaScriptMessage message) { - messages.add(message.message); + channelCompleter.complete(message.message); }, ), ); @@ -316,10 +316,7 @@ Future main() async { await pageFinished.future; await controller.runJavaScript('Channel.postMessage(undefined);'); - await controller.runJavaScript('Channel.postMessage(null);'); - - await tester.pumpAndSettle(); - expect(messages, ['undefined', 'null']); + await expectLater(channelCompleter.future, completion('')); }); testWidgets('resize webview', (WidgetTester tester) async { 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 81089b9e6e7..aca488ea9f9 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 @@ -443,7 +443,6 @@ class WebKitWebViewController extends PlatformWebViewController { webKitParams.name, ), ]); - await _injectPostMessageOverride(webKitParams.name); } @override @@ -769,47 +768,6 @@ window.addEventListener("error", function(e) { await controller.addUserScript(overrideScript); } - Future _injectPostMessageOverride(String channelName) async { - final WKUserScript overrideScript = - _webKitParams.webKitProxy.newWKUserScript( - source: ''' -var _flutter_webview_plugin_overrides = _flutter_webview_plugin_overrides || {}; - -_flutter_webview_plugin_overrides.originalPostMessageFunctions = _flutter_webview_plugin_overrides.originalPostMessageFunctions || {}; - -(function() { - if (window.webkit && window.webkit.messageHandlers) { - const handlerName = "$channelName"; - const handler = window.webkit.messageHandlers[handlerName]; - - if (handler && - typeof handler.postMessage === 'function' && - !_flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName]) { - - _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName] = handler.postMessage; - - handler.postMessage = function(data) { - if (data === undefined) { - return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, "undefined"); - } - if (data === null) { - return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, "null"); - } - return _flutter_webview_plugin_overrides.originalPostMessageFunctions[handlerName].call(this, data); - }; - } - } -})(); - ''', - injectionTime: UserScriptInjectionTime.atDocumentStart, - isForMainFrameOnly: false, - ); - - final WKUserContentController controller = - await _webView.configuration.getUserContentController(); - await controller.addUserScript(overrideScript); - } - // WKWebView does not support removing a single user script, so all user // scripts and all message handlers are removed instead. And the JavaScript // channels that shouldn't be removed are re-registered. Note that this 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 c8240c2ae19..e6a350de4e6 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 @@ -863,7 +863,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList().first as WKUserScript; + .single as WKUserScript; expect(userScript.source, 'window.name = webkit.messageHandlers.name;'); expect( userScript.injectionTime, @@ -1008,7 +1008,7 @@ void main() { final WKUserScript userScript = verify(mockUserContentController.addUserScript(captureAny)) .captured - .toList().first as WKUserScript; + .single as WKUserScript; expect(userScript.source, 'window.name2 = webkit.messageHandlers.name2;'); expect( userScript.injectionTime, From ef6ccae30679874f210812532d5ac4d61a7bb556 Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Tue, 25 Mar 2025 09:41:40 +0800 Subject: [PATCH 09/10] Return '(null)' when message.body is null --- .../example/integration_test/webview_flutter_test.dart | 2 +- .../lib/src/webkit_webview_controller.dart | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 5f67cfab257..83a13e3d6bb 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -316,7 +316,7 @@ Future main() async { await pageFinished.future; await controller.runJavaScript('Channel.postMessage(undefined);'); - await expectLater(channelCompleter.future, completion('')); + await expectLater(channelCompleter.future, completion('(null)')); }); testWidgets('resize webview', (WidgetTester tester) async { 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 aca488ea9f9..42b6a4cac97 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 @@ -905,8 +905,13 @@ class WebKitJavaScriptChannelParams extends JavaScriptChannelParams { (WeakReference weakReference) { return (_, __, WKScriptMessage message) { if (weakReference.target != null) { + // When message.body is null, return '(null)' for consistency + // with previous implementations. weakReference.target!( - JavaScriptMessage(message: message.body?.toString() ?? ''), + JavaScriptMessage( + message: message.body == null + ? '(null)' + : message.body!.toString()), ); } }; From 4bde9bceb2f47a444023a3f4c79c084eabd06f5c Mon Sep 17 00:00:00 2001 From: LinXunFeng Date: Wed, 26 Mar 2025 09:57:43 +0800 Subject: [PATCH 10/10] Remove unnecessary symbols --- .../lib/src/common/weak_reference_utils.dart | 2 +- .../lib/src/legacy/web_kit_webview_widget.dart | 2 +- .../lib/src/webkit_webview_controller.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart index e3aead42f13..014d9eb42ea 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/weak_reference_utils.dart @@ -18,7 +18,7 @@ /// ) { /// weakReference.target?.onJavascriptChannelMessage( /// message.name, -/// message.body?.toString() ?? '', +/// message.body.toString(), /// ); /// }; /// }, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart index 016f1734b94..89e184a89a5 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/legacy/web_kit_webview_widget.dart @@ -456,7 +456,7 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { ) { weakReference.target?.onJavascriptChannelMessage( message.name, - message.body!.toString(), + message.body.toString(), ); }; }, 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 42b6a4cac97..843c73f3de3 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 @@ -911,7 +911,7 @@ class WebKitJavaScriptChannelParams extends JavaScriptChannelParams { JavaScriptMessage( message: message.body == null ? '(null)' - : message.body!.toString()), + : message.body.toString()), ); } };