-
Notifications
You must be signed in to change notification settings - Fork 3.3k
[webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel #8776
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel #8776
Conversation
* main: [webview_flutter_wkwebview] Fixes crash with nil `WKFrameInfo.request` (flutter#8766) # Conflicts: # packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
Is there an update on when this PR will be approved and released? Its causing a blocking production issue for us |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@stuartmorgan / @tarrinneal for secondary review.
@@ -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() ?? ''), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How was ''
chosen as the value here? Is this what the iOS implementation returned prior to the proxy API migration? Is it what webview_android
returns? Other?
The linked issue notably says that it expects a different value (the string undefined
), so I'd like to make sure we're picking ''
for a clear reason.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From my testing, passing undefined
to the JavaScriptChannel leads to a null
value in this callback. So in practice, undefined
seems indistinguishable from a null
value. However, I could see a rational for passing the string 'null'
instead. I will check what happens on Android.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like Android returns the string 'undefined'
and crashes when passing null
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since I can't get the undefined
passed through postMessage
in the userContentController
method, I've now overridden the postMessage
method to preserve the undefined
and null
output.

Since I am not familiar with Android, I did not handle the crash issue when passing null
. This may require another PR to handle.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Injecting JS into every single page is problematic; it can lead to a lot of unexpected and hard-to-debug edge cases. It should be a method of absolutely last resort only if there is no other way to accomplish necessary goals. Polyfilling slight differences between iOS and Android behaviors is not sufficiently critical to warrant such an approach.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it makes sense to return the string null
when WKScriptMessage.body == null
. I think this is better because a user could still differentiate between receiving a null
or an empty string the majority of the time.
I think the main problem is that JavaScriptMessage.message
is non-null in the platform interface, but changing this is a breaking change.
Your thoughts @stuartmorgan?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the main problem is that
JavaScriptMessage.message
is non-null in the platform interface, but changing this is a breaking change.
Yes, ideally we should have designed this to be more consistent with runJavaScript
, where we distinguish unsupported values (in that case with an error, but we'd need something else here).
Given the constraints we have now, I think I would vote for '(null)'
for consistency with previous implementations on iOS.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, now I've adjusted it to return '(null)'
when WKScriptMessage.body == null
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Flagging for changes to ensure that the PR doesn't land as currently written.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM with nits.
@bparrishMines Are you okay with '(null)'
?
@@ -18,7 +18,7 @@ | |||
/// ) { | |||
/// weakReference.target?.onJavascriptChannelMessage( | |||
/// message.name, | |||
/// message.body!.toString(), | |||
/// message.body?.toString() ?? '', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is misleading example code as written, since .toString
can be called on null
; the ?? ''
part can never execute. You could just remove the !
from the previous code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
JavaScriptMessage( | ||
message: message.body == null | ||
? '(null)' | ||
: message.body!.toString()), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The !
shouldn't be needed here, for the same reason.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…e via javascript channel (flutter#8776) Fixes flutter/flutter#162352
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
…ned message via javascript channel (flutter/packages#8776)
flutter/packages@125c117...07496eb 2025-04-02 alexander.irion@siemens.com [multicast_dns] MDnsClient::listen supports onError callback (flutter/packages#8888) 2025-04-02 15619084+vashworth@users.noreply.github.com Upgrade tests to use Xcode 16 and iOS 18 (flutter/packages#8968) 2025-04-01 engine-flutter-autoroll@skia.org Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) (flutter/packages#8960) 2025-04-01 kevmoo@users.noreply.github.com Drop deprecated HTML head meta tags (flutter/packages#8970) 2025-04-01 stuartmorgan@google.com Adjust PR checklist formatter discussion (flutter/packages#8924) 2025-04-01 stuartmorgan@google.com Update CODEOWNERS username (flutter/packages#8933) 2025-04-01 69054810+M97Chahboun@users.noreply.github.com [flutter_markdown] Added sizedImageBuilder to Markdown widget (flutter/packages#6739) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip impl copy of iOS tests (flutter/packages#8975) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip more hanging iOS tests (flutter/packages#8967) 2025-04-01 stanleycocoa@gmail.com [url_launcher] When not fully loaded, clicking close causes the callback to not be triggered correctly. (flutter/packages#8582) 2025-04-01 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 2 (flutter/packages#8892) 2025-03-31 15619084+vashworth@users.noreply.github.com [webview_flutter] Skip flaky legacy tests on iOS (flutter/packages#8911) 2025-03-31 davidmartos96@gmail.com [camera_android] Don't override default fps range when not recording (flutter/packages#8891) 2025-03-31 filiph@users.noreply.github.com [google_maps_flutter] Fix typo and remove duplicitous CHANGELOG entry (flutter/packages#8754) 2025-03-31 kevmoo@users.noreply.github.com [extension_gsi] Support the latest version of googleapis_auth (flutter/packages#8931) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/test_plugin/android (flutter/packages#8955) 2025-03-31 linxunfeng@yeah.net [webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel (flutter/packages#8776) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/alternate_language_test_plugin/android (flutter/packages#8946) 2025-03-31 10687576+bparrishMines@users.noreply.github.com [interactive_media_ads] Fixes `AdEventType`s not triggering on iOS in release mode (flutter/packages#8918) 2025-03-31 stuartmorgan@google.com [google_maps_flutter] Skip test that hangs iOS CI (flutter/packages#8958) 2025-03-28 engine-flutter-autoroll@skia.org Manual roll Flutter from b16430b to 1d954f4 (114 revisions) (flutter/packages#8922) 2025-03-28 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 3 (flutter/packages#8912) 2025-03-27 jacksongardner@google.com Use a more deterministic way of waiting for ad widgets to be ready. (flutter/packages#8920) 2025-03-27 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 1 (flutter/packages#8890) 2025-03-27 tarrinneal@gmail.com [pigeon] correct usage of extended generics in generator methods (flutter/packages#8910) 2025-03-27 34892635+fa0311@users.noreply.github.com [video_player] Fix layout issue caused by `Transform.rotate` not affecting space calculation. (flutter/packages#8685) 2025-03-27 43759233+kenzieschmoll@users.noreply.github.com [shared_preferences] Fix a late initialized error with the example app (flutter/packages#8540) 2025-03-26 stuartmorgan@google.com [various] Disable sandbox in Chrome dart tests (flutter/packages#8909) 2025-03-25 stuartmorgan@google.com [tool] Move changed file detection to base command class (flutter/packages#8730) 2025-03-25 34327253+lenzpaul@users.noreply.github.com [Camera] Add lens type information (iOS) (flutter/packages#8723) 2025-03-25 tarrinneal@gmail.com [pigeon] kotlin equality methods (flutter/packages#8887) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --------- Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com>
flutter/packages@125c117...07496eb 2025-04-02 alexander.irion@siemens.com [multicast_dns] MDnsClient::listen supports onError callback (flutter/packages#8888) 2025-04-02 15619084+vashworth@users.noreply.github.com Upgrade tests to use Xcode 16 and iOS 18 (flutter/packages#8968) 2025-04-01 engine-flutter-autoroll@skia.org Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) (flutter/packages#8960) 2025-04-01 kevmoo@users.noreply.github.com Drop deprecated HTML head meta tags (flutter/packages#8970) 2025-04-01 stuartmorgan@google.com Adjust PR checklist formatter discussion (flutter/packages#8924) 2025-04-01 stuartmorgan@google.com Update CODEOWNERS username (flutter/packages#8933) 2025-04-01 69054810+M97Chahboun@users.noreply.github.com [flutter_markdown] Added sizedImageBuilder to Markdown widget (flutter/packages#6739) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip impl copy of iOS tests (flutter/packages#8975) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip more hanging iOS tests (flutter/packages#8967) 2025-04-01 stanleycocoa@gmail.com [url_launcher] When not fully loaded, clicking close causes the callback to not be triggered correctly. (flutter/packages#8582) 2025-04-01 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 2 (flutter/packages#8892) 2025-03-31 15619084+vashworth@users.noreply.github.com [webview_flutter] Skip flaky legacy tests on iOS (flutter/packages#8911) 2025-03-31 davidmartos96@gmail.com [camera_android] Don't override default fps range when not recording (flutter/packages#8891) 2025-03-31 filiph@users.noreply.github.com [google_maps_flutter] Fix typo and remove duplicitous CHANGELOG entry (flutter/packages#8754) 2025-03-31 kevmoo@users.noreply.github.com [extension_gsi] Support the latest version of googleapis_auth (flutter/packages#8931) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/test_plugin/android (flutter/packages#8955) 2025-03-31 linxunfeng@yeah.net [webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel (flutter/packages#8776) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/alternate_language_test_plugin/android (flutter/packages#8946) 2025-03-31 10687576+bparrishMines@users.noreply.github.com [interactive_media_ads] Fixes `AdEventType`s not triggering on iOS in release mode (flutter/packages#8918) 2025-03-31 stuartmorgan@google.com [google_maps_flutter] Skip test that hangs iOS CI (flutter/packages#8958) 2025-03-28 engine-flutter-autoroll@skia.org Manual roll Flutter from b16430b to 1d954f4 (114 revisions) (flutter/packages#8922) 2025-03-28 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 3 (flutter/packages#8912) 2025-03-27 jacksongardner@google.com Use a more deterministic way of waiting for ad widgets to be ready. (flutter/packages#8920) 2025-03-27 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 1 (flutter/packages#8890) 2025-03-27 tarrinneal@gmail.com [pigeon] correct usage of extended generics in generator methods (flutter/packages#8910) 2025-03-27 34892635+fa0311@users.noreply.github.com [video_player] Fix layout issue caused by `Transform.rotate` not affecting space calculation. (flutter/packages#8685) 2025-03-27 43759233+kenzieschmoll@users.noreply.github.com [shared_preferences] Fix a late initialized error with the example app (flutter/packages#8540) 2025-03-26 stuartmorgan@google.com [various] Disable sandbox in Chrome dart tests (flutter/packages#8909) 2025-03-25 stuartmorgan@google.com [tool] Move changed file detection to base command class (flutter/packages#8730) 2025-03-25 34327253+lenzpaul@users.noreply.github.com [Camera] Add lens type information (iOS) (flutter/packages#8723) 2025-03-25 tarrinneal@gmail.com [pigeon] kotlin equality methods (flutter/packages#8887) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --------- Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com>
…ned message via javascript channel (flutter/packages#8776)
…e via javascript channel (flutter#8776) Fixes flutter/flutter#162352
…er#166457) flutter/packages@125c117...07496eb 2025-04-02 alexander.irion@siemens.com [multicast_dns] MDnsClient::listen supports onError callback (flutter/packages#8888) 2025-04-02 15619084+vashworth@users.noreply.github.com Upgrade tests to use Xcode 16 and iOS 18 (flutter/packages#8968) 2025-04-01 engine-flutter-autoroll@skia.org Manual roll Flutter from 1d954f4 to 05b5e79 (225 revisions) (flutter/packages#8960) 2025-04-01 kevmoo@users.noreply.github.com Drop deprecated HTML head meta tags (flutter/packages#8970) 2025-04-01 stuartmorgan@google.com Adjust PR checklist formatter discussion (flutter/packages#8924) 2025-04-01 stuartmorgan@google.com Update CODEOWNERS username (flutter/packages#8933) 2025-04-01 69054810+M97Chahboun@users.noreply.github.com [flutter_markdown] Added sizedImageBuilder to Markdown widget (flutter/packages#6739) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip impl copy of iOS tests (flutter/packages#8975) 2025-04-01 stuartmorgan@google.com [google_maps_flutter] Skip more hanging iOS tests (flutter/packages#8967) 2025-04-01 stanleycocoa@gmail.com [url_launcher] When not fully loaded, clicking close causes the callback to not be triggered correctly. (flutter/packages#8582) 2025-04-01 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 2 (flutter/packages#8892) 2025-03-31 15619084+vashworth@users.noreply.github.com [webview_flutter] Skip flaky legacy tests on iOS (flutter/packages#8911) 2025-03-31 davidmartos96@gmail.com [camera_android] Don't override default fps range when not recording (flutter/packages#8891) 2025-03-31 filiph@users.noreply.github.com [google_maps_flutter] Fix typo and remove duplicitous CHANGELOG entry (flutter/packages#8754) 2025-03-31 kevmoo@users.noreply.github.com [extension_gsi] Support the latest version of googleapis_auth (flutter/packages#8931) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/test_plugin/android (flutter/packages#8955) 2025-03-31 linxunfeng@yeah.net [webview_flutter_wkwebview] Fixes crash when sending undefined message via javascript channel (flutter/packages#8776) 2025-03-31 49699333+dependabot[bot]@users.noreply.github.com [dependabot]: Bump com.android.tools.build:gradle from 8.0.0 to 8.9.1 in /packages/pigeon/platform_tests/alternate_language_test_plugin/android (flutter/packages#8946) 2025-03-31 10687576+bparrishMines@users.noreply.github.com [interactive_media_ads] Fixes `AdEventType`s not triggering on iOS in release mode (flutter/packages#8918) 2025-03-31 stuartmorgan@google.com [google_maps_flutter] Skip test that hangs iOS CI (flutter/packages#8958) 2025-03-28 engine-flutter-autoroll@skia.org Manual roll Flutter from b16430b to 1d954f4 (114 revisions) (flutter/packages#8922) 2025-03-28 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 3 (flutter/packages#8912) 2025-03-27 jacksongardner@google.com Use a more deterministic way of waiting for ad widgets to be ready. (flutter/packages#8920) 2025-03-27 robert.odrowaz@leancode.pl [camera_avfoundation] Test utils and mocks swift migration - part 1 (flutter/packages#8890) 2025-03-27 tarrinneal@gmail.com [pigeon] correct usage of extended generics in generator methods (flutter/packages#8910) 2025-03-27 34892635+fa0311@users.noreply.github.com [video_player] Fix layout issue caused by `Transform.rotate` not affecting space calculation. (flutter/packages#8685) 2025-03-27 43759233+kenzieschmoll@users.noreply.github.com [shared_preferences] Fix a late initialized error with the example app (flutter/packages#8540) 2025-03-26 stuartmorgan@google.com [various] Disable sandbox in Chrome dart tests (flutter/packages#8909) 2025-03-25 stuartmorgan@google.com [tool] Move changed file detection to base command class (flutter/packages#8730) 2025-03-25 34327253+lenzpaul@users.noreply.github.com [Camera] Add lens type information (iOS) (flutter/packages#8723) 2025-03-25 tarrinneal@gmail.com [pigeon] kotlin equality methods (flutter/packages#8887) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --------- Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com>
…e via javascript channel (flutter#8776) Fixes flutter/flutter#162352
Fixes flutter/flutter#162352
Pre-launch Checklist
dart format
.)[shared_preferences]
pubspec.yaml
with an appropriate new version according to the pub versioning philosophy, or this PR is exempt from version changes.CHANGELOG.md
to add a description of the change, following repository CHANGELOG style, or this PR is exempt from CHANGELOG changes.///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.