[iOS] Handle taps on passkey welcome screen "Not now" button
This CL handles taps on the passkey welcome screen "Not now" button by
asking the PasskeyWelcomeScreenViewController's delegate to dismiss it's
view.
Video:
https://drive.google.com/file/d/1MO2SCFRYY8Oyp0WZURJKYrylHkCq11_E/view?usp=drive_link&resourcekey=0-CFemJiQh9KfpoSzxrmIcgA
Bug: 355042392
Change-Id: I794458f911eaaa4bfb521d4336cef576495045d8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6000814
Reviewed-by: Alexis Hétu <sugoi@chromium.org>
Commit-Queue: Noémie St-Onge <noemies@google.com>
Cr-Commit-Position: refs/heads/main@{#1379887}
diff --git a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
index c8e888a..9a353eb3 100644
--- a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
@@ -50,6 +50,7 @@
ConfirmationAlertActionHandler,
CredentialResponseHandler,
PasskeyKeychainProviderBridgeDelegate,
+ PasskeyWelcomeScreenViewControllerDelegate,
SuccessfulReauthTimeAccessor>
// Interface for the persistent credential store.
@@ -504,6 +505,17 @@
primaryButtonAction:reauthenticateBlock];
}
+#pragma mark - PasskeyWelcomeScreenViewControllerDelegate
+
+- (void)passkeyWelcomeScreenViewControllerShouldBeDismissed:
+ (id)passkeyWelcomeScreenViewController {
+ if (self.passkeyNavigationController.topViewController ==
+ passkeyWelcomeScreenViewController) {
+ [self.passkeyNavigationController popViewControllerAnimated:YES];
+ }
+ [self exitWithErrorCode:ASExtensionErrorCodeUserCanceled];
+}
+
#pragma mark - SuccessfulReauthTimeAccessor
- (void)updateSuccessfulReauthTime {
@@ -942,6 +954,7 @@
[[PasskeyWelcomeScreenViewController alloc]
initForPurpose:purpose
navigationItemTitleView:self.passkeyNavigationItemTitleView
+ delegate:self
primaryButtonAction:action];
[self.passkeyNavigationController pushViewController:welcomeScreen
animated:NO];
diff --git a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.h b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.h
index a6eea6f..eb0de10 100644
--- a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.h
+++ b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.h
@@ -10,6 +10,8 @@
#import "base/ios/block_types.h"
#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h"
+@class PasskeyWelcomeScreenViewController;
+
// Possible purposes for showing the passkey welcome screen.
enum class PasskeyWelcomeScreenPurpose {
kEnroll,
@@ -17,6 +19,15 @@
kReauthenticate,
};
+// Delegate for the PasskeyWelcomeScreenViewController.
+@protocol PasskeyWelcomeScreenViewControllerDelegate
+
+// Dismisses the `passkeyWelcomeScreenViewController`.
+- (void)passkeyWelcomeScreenViewControllerShouldBeDismissed:
+ (PasskeyWelcomeScreenViewController*)passkeyWelcomeScreenViewController;
+
+@end
+
// Screen shown to the user when they need to enroll or re-authenticate for
// passkeys.
@interface PasskeyWelcomeScreenViewController : PromoStyleViewController
@@ -28,6 +39,8 @@
// primary button displayed in the view is tapped.
- (instancetype)initForPurpose:(PasskeyWelcomeScreenPurpose)purpose
navigationItemTitleView:(UIView*)navigationItemTitleView
+ delegate:(id<PasskeyWelcomeScreenViewControllerDelegate>)
+ delegate
primaryButtonAction:(ProceduralBlock)primaryButtonAction
NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.mm b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.mm
index d9561e28..d4a85d3 100644
--- a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller.mm
@@ -95,17 +95,24 @@
// The view to be used as the navigation bar title view.
UIView* _navigationItemTitleView;
+ // Delegate for this view controller.
+ __weak id<PasskeyWelcomeScreenViewControllerDelegate>
+ _passkeyWelcomeScreenViewControllerDelegate;
+
// The block that should be executed when the primary button is tapped.
ProceduralBlock _primaryButtonAction;
}
- (instancetype)initForPurpose:(PasskeyWelcomeScreenPurpose)purpose
navigationItemTitleView:(UIView*)navigationItemTitleView
+ delegate:(id<PasskeyWelcomeScreenViewControllerDelegate>)
+ delegate
primaryButtonAction:(ProceduralBlock)primaryButtonAction {
self = [super initWithNibName:nil bundle:nil];
if (self) {
_purpose = purpose;
_navigationItemTitleView = navigationItemTitleView;
+ _passkeyWelcomeScreenViewControllerDelegate = delegate;
_primaryButtonAction = primaryButtonAction;
}
return self;
@@ -154,7 +161,8 @@
}
- (void)didTapSecondaryActionButton {
- // TODO(crbug.com/355042392): Handle taps on "Not now" button.
+ [_passkeyWelcomeScreenViewControllerDelegate
+ passkeyWelcomeScreenViewControllerShouldBeDismissed:self];
}
@end
diff --git a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller_unittest.mm b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller_unittest.mm
index afc951c..fc2e439c 100644
--- a/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller_unittest.mm
+++ b/ios/chrome/credential_provider_extension/ui/passkey_welcome_screen_view_controller_unittest.mm
@@ -16,6 +16,7 @@
return [[PasskeyWelcomeScreenViewController alloc]
initForPurpose:purpose
navigationItemTitleView:[[UIView alloc] init]
+ delegate:nil
primaryButtonAction:nil];
}
};