Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[url_launcher] When not fully loaded, clicking close causes the callback to not be triggered correctly. #8582

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

Merged
merged 15 commits into from
Apr 1, 2025

Conversation

StanleyCocos
Copy link
Contributor

@StanleyCocos StanleyCocos commented Feb 7, 2025

When SFSafariViewController is loading a webpage, if the close button is clicked during the loading process, it can prevent the callback from being triggered correctly.

List which issues are fixed by this PR. You must list at least one issue.

Pre-launch Checklist

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I read the [Tree Hygiene] page, which explains my responsibilities.
  • I read and followed the [relevant style guides] and ran the auto-formatter. (Unlike the flutter/flutter repo, the flutter/packages repo does use dart format.)
  • I signed the [CLA].
  • The title of the PR starts with the name of the package surrounded by square brackets, e.g. [shared_preferences]
  • I [linked to at least one issue that this PR fixes] in the description above.
  • I updated pubspec.yaml with an appropriate new version according to the [pub versioning philosophy], or this PR is [exempt from version changes].
  • I updated CHANGELOG.md to add a description of the change, [following repository CHANGELOG style], or this PR is [exempt from CHANGELOG changes].
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is [test-exempt].
  • All existing and new tests are passing.

@flutter-dashboard
Copy link

It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!).

If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix?

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group.

@StanleyCocos

This comment was marked as resolved.

@stuartmorgan-g
Copy link
Contributor

This should be testable with native unit tests that directly drive calls to the URLLaunchSession.

@@ -12,6 +12,7 @@ final class URLLaunchSession: NSObject, SFSafariViewControllerDelegate {

private let completion: OpenInSafariCompletionHandler
private let url: URL
private var isLoadCompleted: Bool?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A nullable boolean should only be used when there are three conceptually different states. The code in this PR only actually recognizes two.

@StanleyCocos

This comment was marked as resolved.

@stuartmorgan-g stuartmorgan-g changed the title fix(url_launcher): When not fully loaded, clicking close causes the callback to not be triggered correctly. [url_launcher] When not fully loaded, clicking close causes the callback to not be triggered correctly. Feb 8, 2025
@stuartmorgan-g
Copy link
Contributor

That's a Dart unit test, which does not run the code you changed; native unit tests are here, as described in our contributor docs.

@stuartmorgan-g stuartmorgan-g marked this pull request as draft February 8, 2025 22:12
@stuartmorgan-g
Copy link
Contributor

(Marking as Draft pending the test, so it doesn't show up in review queues.)

@StanleyCocos StanleyCocos marked this pull request as ready for review February 10, 2025 03:17
@StanleyCocos
Copy link
Contributor Author

Oh, my God. I forgot. Thanks for the reminder. I’ve added the test. If you have time, you can continue review

@stuartmorgan-g stuartmorgan-g added the triage-ios Should be looked at in iOS triage label Feb 10, 2025
@jmagman jmagman requested review from loic-sharma and removed request for jmagman February 12, 2025 22:25
}

/// Called when the user finishes using the Safari view controller.
///
/// - Parameter controller: The Safari view controller.
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
if !isLoadCompleted {
completion(.success(.failedToLoad))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is .failedToLoad the correct result here? Or we should add a new InAppLoadResult.dismissed result?

If this is the correct result, should we update this comment to indicate this case can happen if the user dismisses the Safari view before the initial load completes?

/// The URL did not load successfully.
failedToLoad,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first, I did consider adding a new InAppLoadResult to describe the close action, but it seems it could lead to confusion among developers. This is because, currently, after a successful load, clicking the close button does not trigger any callback.

Additionally, when the user clicks close before the loading is complete, triggering the failedToLoad callback seems reasonable in a broader sense, as the interruption of the loading process can be considered a loading failure.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this is the correct result, should we update this comment to indicate this case can happen if the user dismisses the Safari view before the initial load completes?

Do you think it’s possible to modify the comment like this:

// The URL did not load successfully (or close the SFSafariViewController earlier)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning this will throw an exception saying there was an error loading the page, which seems misleading. I think a new Pigeon return type that Dart interprets to return false would be better.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created a new dismissed state to represent the current status.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @stuartmorgan
Could you take another look?

@jmagman
Copy link
Member

jmagman commented Mar 31, 2025

@stuartmorgan-g could you take a look at this and re-review? Thank you!

Copy link
Contributor

@stuartmorgan-g stuartmorgan-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, sorry for the delay

@stuartmorgan-g stuartmorgan-g added the autosubmit Merge PR when tree becomes green via auto submit App label Apr 1, 2025
@auto-submit auto-submit bot merged commit 1063222 into flutter:main Apr 1, 2025
82 checks passed
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 1, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 2, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 2, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 2, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 2, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 2, 2025
github-merge-queue bot pushed a commit to flutter/flutter that referenced this pull request Apr 2, 2025
flutter/packages@125c117...07496eb

2025-04-02 [email protected] [multicast_dns]
MDnsClient::listen supports onError callback (flutter/packages#8888)
2025-04-02 [email protected] Upgrade tests to
use Xcode 16 and iOS 18 (flutter/packages#8968)
2025-04-01 [email protected] Manual roll Flutter from
1d954f4 to 05b5e79 (225 revisions) (flutter/packages#8960)
2025-04-01 [email protected] Drop deprecated HTML head
meta tags (flutter/packages#8970)
2025-04-01 [email protected] Adjust PR checklist formatter
discussion (flutter/packages#8924)
2025-04-01 [email protected] Update CODEOWNERS username
(flutter/packages#8933)
2025-04-01 [email protected]
[flutter_markdown] Added sizedImageBuilder to Markdown widget
(flutter/packages#6739)
2025-04-01 [email protected] [google_maps_flutter] Skip impl copy
of iOS tests (flutter/packages#8975)
2025-04-01 [email protected] [google_maps_flutter] Skip more
hanging iOS tests (flutter/packages#8967)
2025-04-01 [email protected] [url_launcher] When not fully loaded,
clicking close causes the callback to not be triggered correctly.
(flutter/packages#8582)
2025-04-01 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 2 (flutter/packages#8892)
2025-03-31 [email protected] [webview_flutter]
Skip flaky legacy tests on iOS (flutter/packages#8911)
2025-03-31 [email protected] [camera_android] Don't override
default fps range when not recording (flutter/packages#8891)
2025-03-31 [email protected] [google_maps_flutter] Fix
typo and remove duplicitous CHANGELOG entry (flutter/packages#8754)
2025-03-31 [email protected] [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 [email protected] [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 [email protected]
[interactive_media_ads] Fixes `AdEventType`s not triggering on iOS in
release mode (flutter/packages#8918)
2025-03-31 [email protected] [google_maps_flutter] Skip test that
hangs iOS CI (flutter/packages#8958)
2025-03-28 [email protected] Manual roll Flutter from
b16430b to 1d954f4 (114 revisions) (flutter/packages#8922)
2025-03-28 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 3 (flutter/packages#8912)
2025-03-27 [email protected] Use a more deterministic way of
waiting for ad widgets to be ready. (flutter/packages#8920)
2025-03-27 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 1 (flutter/packages#8890)
2025-03-27 [email protected] [pigeon] correct usage of extended
generics in generator methods (flutter/packages#8910)
2025-03-27 [email protected] [video_player] Fix
layout issue caused by `Transform.rotate` not affecting space
calculation. (flutter/packages#8685)
2025-03-27 [email protected]
[shared_preferences] Fix a late initialized error with the example app
(flutter/packages#8540)
2025-03-26 [email protected] [various] Disable sandbox in Chrome
dart tests (flutter/packages#8909)
2025-03-25 [email protected] [tool] Move changed file detection to
base command class (flutter/packages#8730)
2025-03-25 [email protected] [Camera] Add lens
type information (iOS) (flutter/packages#8723)
2025-03-25 [email protected] [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 [email protected] 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 <[email protected]>
github-merge-queue bot pushed a commit to flutter/flutter that referenced this pull request Apr 3, 2025
flutter/packages@125c117...07496eb

2025-04-02 [email protected] [multicast_dns]
MDnsClient::listen supports onError callback (flutter/packages#8888)
2025-04-02 [email protected] Upgrade tests to
use Xcode 16 and iOS 18 (flutter/packages#8968)
2025-04-01 [email protected] Manual roll Flutter from
1d954f4 to 05b5e79 (225 revisions) (flutter/packages#8960)
2025-04-01 [email protected] Drop deprecated HTML head
meta tags (flutter/packages#8970)
2025-04-01 [email protected] Adjust PR checklist formatter
discussion (flutter/packages#8924)
2025-04-01 [email protected] Update CODEOWNERS username
(flutter/packages#8933)
2025-04-01 [email protected]
[flutter_markdown] Added sizedImageBuilder to Markdown widget
(flutter/packages#6739)
2025-04-01 [email protected] [google_maps_flutter] Skip impl copy
of iOS tests (flutter/packages#8975)
2025-04-01 [email protected] [google_maps_flutter] Skip more
hanging iOS tests (flutter/packages#8967)
2025-04-01 [email protected] [url_launcher] When not fully loaded,
clicking close causes the callback to not be triggered correctly.
(flutter/packages#8582)
2025-04-01 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 2 (flutter/packages#8892)
2025-03-31 [email protected] [webview_flutter]
Skip flaky legacy tests on iOS (flutter/packages#8911)
2025-03-31 [email protected] [camera_android] Don't override
default fps range when not recording (flutter/packages#8891)
2025-03-31 [email protected] [google_maps_flutter] Fix
typo and remove duplicitous CHANGELOG entry (flutter/packages#8754)
2025-03-31 [email protected] [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 [email protected] [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 [email protected]
[interactive_media_ads] Fixes `AdEventType`s not triggering on iOS in
release mode (flutter/packages#8918)
2025-03-31 [email protected] [google_maps_flutter] Skip test that
hangs iOS CI (flutter/packages#8958)
2025-03-28 [email protected] Manual roll Flutter from
b16430b to 1d954f4 (114 revisions) (flutter/packages#8922)
2025-03-28 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 3 (flutter/packages#8912)
2025-03-27 [email protected] Use a more deterministic way of
waiting for ad widgets to be ready. (flutter/packages#8920)
2025-03-27 [email protected] [camera_avfoundation] Test utils
and mocks swift migration - part 1 (flutter/packages#8890)
2025-03-27 [email protected] [pigeon] correct usage of extended
generics in generator methods (flutter/packages#8910)
2025-03-27 [email protected] [video_player] Fix
layout issue caused by `Transform.rotate` not affecting space
calculation. (flutter/packages#8685)
2025-03-27 [email protected]
[shared_preferences] Fix a late initialized error with the example app
(flutter/packages#8540)
2025-03-26 [email protected] [various] Disable sandbox in Chrome
dart tests (flutter/packages#8909)
2025-03-25 [email protected] [tool] Move changed file detection to
base command class (flutter/packages#8730)
2025-03-25 [email protected] [Camera] Add lens
type information (iOS) (flutter/packages#8723)
2025-03-25 [email protected] [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 [email protected] 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 <[email protected]>
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Apr 3, 2025
@StanleyCocos StanleyCocos deleted the fix/url_launcher_ios branch April 7, 2025 01:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App p: url_launcher platform-ios triage-ios Should be looked at in iOS triage
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug Report: CupertinoListTile Remains backgroundColorActivated After launchUrl(url) [url_launcher] Result doesn't fire on early dismissal (iOS)
4 participants