Commit 39f0519b authored by Chris Lu's avatar Chris Lu Committed by Commit Bot

[ios] Add SaveCard Modal Overlay Mediator

This change adds SaveCardInfobarModalOverlayMediator and
SaveCardInfobarModalOverlayCoordinator to manage the SaveCard Overlay
Modal UI.

Bug: 1071914
Change-Id: I137f38832a56cbf1e0cf934c86c39b1066c08dc9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2246795
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#780068}
parent 9eb74e10
...@@ -208,7 +208,7 @@ ...@@ -208,7 +208,7 @@
kExpirationMonthPrefKey : self.expirationMonth, kExpirationMonthPrefKey : self.expirationMonth,
kExpirationYearPrefKey : self.expirationYear, kExpirationYearPrefKey : self.expirationYear,
kLegalMessagesPrefKey : [self legalMessagesForModal], kLegalMessagesPrefKey : [self legalMessagesForModal],
kCurrentCardSavedPrefKey : @(!self.infobarAccepted), kCurrentCardSavedPrefKey : @(self.infobarAccepted),
kSupportsEditingPrefKey : @(supportsEditing) kSupportsEditingPrefKey : @(supportsEditing)
}; };
[self.modalConsumer setupModalViewControllerWithPrefs:prefs]; [self.modalConsumer setupModalViewControllerWithPrefs:prefs];
......
...@@ -200,7 +200,7 @@ typedef NS_ENUM(NSInteger, ItemType) { ...@@ -200,7 +200,7 @@ typedef NS_ENUM(NSInteger, ItemType) {
self.saveCardButtonItem.textAlignment = NSTextAlignmentNatural; self.saveCardButtonItem.textAlignment = NSTextAlignmentNatural;
self.saveCardButtonItem.buttonText = self.saveCardButtonItem.buttonText =
l10n_util::GetNSString(IDS_IOS_AUTOFILL_SAVE_CARD); l10n_util::GetNSString(IDS_IOS_AUTOFILL_SAVE_CARD);
self.saveCardButtonItem.enabled = self.currentCardSaved; self.saveCardButtonItem.enabled = !self.currentCardSaved;
self.saveCardButtonItem.disableButtonIntrinsicWidth = YES; self.saveCardButtonItem.disableButtonIntrinsicWidth = YES;
[model addItem:self.saveCardButtonItem [model addItem:self.saveCardButtonItem
toSectionWithIdentifier:SectionIdentifierContent]; toSectionWithIdentifier:SectionIdentifierContent];
......
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
source_set("save_card") {
sources = [
"save_card_infobar_modal_overlay_coordinator.h",
"save_card_infobar_modal_overlay_coordinator.mm",
"save_card_infobar_modal_overlay_mediator.h",
"save_card_infobar_modal_overlay_mediator.mm",
"save_card_infobar_modal_overlay_mediator_delegate.h",
]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
"//base",
"//components/autofill/core/common",
"//ios/chrome/app/strings:ios_strings_grit",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/common/infobars",
"//ios/chrome/browser/overlays/public/infobar_modal",
"//ios/chrome/browser/ui/autofill:autofill_message",
"//ios/chrome/browser/ui/infobars/modals",
"//ios/chrome/browser/ui/overlays:coordinators",
"//ios/chrome/browser/ui/overlays/infobar_modal:coordinators",
"//ios/chrome/browser/ui/overlays/infobar_modal:mediators",
"//ios/chrome/browser/ui/util",
"//ui/base",
]
}
source_set("unit_tests") {
testonly = true
sources = [ "save_card_infobar_modal_overlay_mediator_unittest.mm" ]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
"//base/test:test_support",
"//components/autofill/core/browser",
"//components/autofill/core/browser:test_support",
"//components/infobars/core",
"//components/infobars/core:feature_flags",
"//components/prefs",
"//ios/chrome/browser/infobars",
"//ios/chrome/browser/infobars/test",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/infobar_modal",
"//ios/chrome/browser/overlays/test",
"//ios/chrome/browser/ui/autofill:autofill_message",
"//ios/chrome/browser/ui/infobars:feature_flags",
"//ios/chrome/browser/ui/infobars/modals",
"//ios/chrome/browser/ui/infobars/modals/test",
"//ios/chrome/browser/ui/infobars/test",
"//ios/chrome/browser/ui/overlays/infobar_modal/save_card",
"//ios/chrome/browser/ui/overlays/test",
"//testing/gmock",
"//testing/gtest",
"//third_party/ocmock",
"//ui/base",
"//url",
]
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_delegate.h"
// A coordinator that displays the Save Card infobar modal UI using
// OverlayPresenter.
@interface SaveCardInfobarModalOverlayCoordinator
: InfobarModalOverlayCoordinator <
SaveCardInfobarModalOverlayMediatorDelegate>
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_coordinator.h"
#include "base/check.h"
#import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h"
#import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_responses.h"
#include "ios/chrome/browser/overlays/public/overlay_callback_manager.h"
#include "ios/chrome/browser/overlays/public/overlay_response.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator+modal_configuration.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using save_card_infobar_overlays::SaveCardModalRequestConfig;
using save_card_infobar_overlays::SaveCardLoadURL;
@interface SaveCardInfobarModalOverlayCoordinator ()
// Redefine ModalConfiguration properties as readwrite.
@property(nonatomic, strong, readwrite) OverlayRequestMediator* modalMediator;
@property(nonatomic, strong, readwrite) UIViewController* modalViewController;
// The request's config.
@property(nonatomic, assign, readonly) SaveCardModalRequestConfig* config;
// URL to load when the modal UI finishes dismissing.
@property(nonatomic, assign) GURL pendingURLToLoad;
@end
@implementation SaveCardInfobarModalOverlayCoordinator
#pragma mark - Accessors
- (SaveCardModalRequestConfig*)config {
return self.request ? self.request->GetConfig<SaveCardModalRequestConfig>()
: nullptr;
}
#pragma mark - Public
+ (const OverlayRequestSupport*)requestSupport {
return SaveCardModalRequestConfig::RequestSupport();
}
#pragma mark - SaveCardInfobarModalOverlayMediatorDelegate
- (void)pendingURLToLoad:(GURL)URL {
const GURL copied_URL(URL);
self.pendingURLToLoad = GURL(copied_URL);
}
@end
@implementation SaveCardInfobarModalOverlayCoordinator (ModalConfiguration)
- (void)configureModal {
DCHECK(!self.modalMediator);
DCHECK(!self.modalViewController);
SaveCardInfobarModalOverlayMediator* modalMediator =
[[SaveCardInfobarModalOverlayMediator alloc]
initWithRequest:self.request];
InfobarSaveCardTableViewController* modalViewController =
[[InfobarSaveCardTableViewController alloc]
initWithModalDelegate:modalMediator];
modalViewController.title =
l10n_util::GetNSString(IDS_IOS_AUTOFILL_SAVE_CARD);
modalMediator.consumer = modalViewController;
modalMediator.save_card_delegate = self;
self.modalMediator = modalMediator;
self.modalViewController = modalViewController;
}
- (void)resetModal {
DCHECK(self.modalMediator);
DCHECK(self.modalViewController);
if (!self.pendingURLToLoad.is_empty() && self.request) {
self.request->GetCallbackManager()->DispatchResponse(
OverlayResponse::CreateWithInfo<SaveCardLoadURL>(
self.pendingURLToLoad));
}
self.modalMediator = nil;
self.modalViewController = nil;
}
@end
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_
#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_mediator.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_modal_delegate.h"
@protocol InfobarSaveCardModalConsumer;
@protocol SaveCardInfobarModalOverlayMediatorDelegate;
// Mediator that configures the modal UI for a passwords infobar.
@interface SaveCardInfobarModalOverlayMediator
: InfobarModalOverlayMediator <InfobarSaveCardModalDelegate>
// The consumer that is configured by this mediator. Setting to a new value
// configures the new consumer.
@property(nonatomic) id<InfobarSaveCardModalConsumer> consumer;
// The delegate of this specific mediator.
@property(nonatomic) id<SaveCardInfobarModalOverlayMediatorDelegate>
save_card_delegate;
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.h"
#include "base/strings/sys_string_conversions.h"
#include "components/autofill/core/common/autofill_payments_features.h"
#import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h"
#import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_responses.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_modal_consumer.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator+modal_configuration.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_delegate.h"
#import "ios/chrome/browser/ui/overlays/overlay_request_mediator+subclassing.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using save_card_infobar_overlays::SaveCardModalRequestConfig;
using save_card_infobar_overlays::SaveCardMainAction;
@interface SaveCardInfobarModalOverlayMediator ()
// The save card modal config from the request.
@property(nonatomic, assign, readonly) SaveCardModalRequestConfig* config;
@end
@implementation SaveCardInfobarModalOverlayMediator
#pragma mark - Accessors
- (SaveCardModalRequestConfig*)config {
return self.request ? self.request->GetConfig<SaveCardModalRequestConfig>()
: nullptr;
}
- (void)setConsumer:(id<InfobarSaveCardModalConsumer>)consumer {
if (_consumer == consumer)
return;
_consumer = consumer;
SaveCardModalRequestConfig* config = self.config;
if (!_consumer || !config)
return;
NSString* cardNumber = [NSString
stringWithFormat:@"•••• %@", base::SysUTF16ToNSString(
config->card_last_four_digits())];
// Only allow editing if the card will be uploaded and it hasn't been
// previously saved.
BOOL supportsEditing =
base::FeatureList::IsEnabled(
autofill::features::kAutofillSaveCardInfobarEditSupport)
? config->should_upload_credentials() && !config->current_card_saved()
: NO;
NSDictionary* prefs = @{
kCardholderNamePrefKey :
base::SysUTF16ToNSString(config->cardholder_name()),
kCardIssuerIconNamePrefKey : NativeImage(config->issuer_icon_id()),
kCardNumberPrefKey : cardNumber,
kExpirationMonthPrefKey :
base::SysUTF16ToNSString(config->expiration_date_month()),
kExpirationYearPrefKey :
base::SysUTF16ToNSString(config->expiration_date_year()),
kLegalMessagesPrefKey : config->legal_message_lines(),
kCurrentCardSavedPrefKey : @(config->current_card_saved()),
kSupportsEditingPrefKey : @(supportsEditing)
};
[_consumer setupModalViewControllerWithPrefs:prefs];
}
#pragma mark - OverlayRequestMediator
+ (const OverlayRequestSupport*)requestSupport {
return SaveCardModalRequestConfig::RequestSupport();
}
#pragma mark - InfobarSaveCardModalDelegate
- (void)saveCardWithCardholderName:(NSString*)cardholderName
expirationMonth:(NSString*)month
expirationYear:(NSString*)year {
[self dispatchResponse:OverlayResponse::CreateWithInfo<SaveCardMainAction>(
cardholderName, month, year)];
[self dismissOverlay];
}
- (void)dismissModalAndOpenURL:(const GURL&)linkURL {
[self.save_card_delegate pendingURLToLoad:linkURL];
[self dismissOverlay];
}
@end
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_DELEGATE_H_
#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_DELEGATE_H_
class GURL;
// Allows the SaveCardInfobarModalOverlayMediator to communicate to present
// information.
@protocol SaveCardInfobarModalOverlayMediatorDelegate <NSObject>
// Sets the URL to load when it finishes dismissing the modal UI.
- (void)pendingURLToLoad:(GURL)URL;
@end
#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_CARD_SAVE_CARD_INFOBAR_MODAL_OVERLAY_MEDIATOR_DELEGATE_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator.h"
#include "base/bind.h"
#include "base/feature_list.h"
#include "base/guid.h"
#include "base/strings/sys_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "components/autofill/core/browser/autofill_client.h"
#include "components/autofill/core/browser/autofill_test_utils.h"
#include "components/autofill/core/browser/data_model/credit_card.h"
#include "components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h"
#include "components/autofill/core/browser/payments/test_legal_message_line.h"
#include "components/infobars/core/infobar_feature.h"
#include "components/prefs/pref_service.h"
#include "ios/chrome/browser/infobars/infobar_ios.h"
#include "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h"
#import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_responses.h"
#include "ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h"
#include "ios/chrome/browser/ui/autofill/save_card_message_with_links.h"
#include "ios/chrome/browser/ui/infobars/infobar_feature.h"
#include "ios/chrome/browser/ui/infobars/modals/infobar_save_card_modal_consumer.h"
#import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_mediator_delegate.h"
#include "testing/gtest_mac.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "third_party/ocmock/gtest_support.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using save_card_infobar_overlays::SaveCardModalRequestConfig;
using save_card_infobar_overlays::SaveCardMainAction;
@interface FakeSaveCardMediatorDelegate
: NSObject <SaveCardInfobarModalOverlayMediatorDelegate>
@property(nonatomic, assign) GURL pendingURLToLoad;
@end
@implementation FakeSaveCardMediatorDelegate
- (void)pendingURLToLoad:(GURL)URL {
self.pendingURLToLoad = URL;
}
@end
@interface FakeSaveCardModalConsumer : NSObject <InfobarSaveCardModalConsumer>
// Prefs passed in setupModalViewControllerWithPrefs:.
@property(nonatomic, copy) NSString* cardholderName;
@property(nonatomic, strong) UIImage* cardIssuerIcon;
@property(nonatomic, copy) NSString* cardNumber;
@property(nonatomic, copy) NSString* expirationMonth;
@property(nonatomic, copy) NSString* expirationYear;
@property(nonatomic, copy)
NSMutableArray<SaveCardMessageWithLinks*>* legalMessages;
@property(nonatomic, assign) BOOL currentCardSaved;
@property(nonatomic, assign) BOOL supportsEditing;
@end
@implementation FakeSaveCardModalConsumer
- (void)setupModalViewControllerWithPrefs:(NSDictionary*)prefs {
self.cardholderName = [prefs[kCardholderNamePrefKey] stringValue];
self.cardIssuerIcon = prefs[kCardIssuerIconNamePrefKey];
self.cardNumber = prefs[kCardNumberPrefKey];
self.expirationMonth = prefs[kExpirationMonthPrefKey];
self.expirationYear = prefs[kExpirationYearPrefKey];
self.legalMessages = prefs[kLegalMessagesPrefKey];
self.currentCardSaved = [prefs[kCurrentCardSavedPrefKey] boolValue];
self.supportsEditing = [prefs[kSupportsEditingPrefKey] boolValue];
}
@end
// Test fixture for SaveCardInfobarModalOverlayMediator.
class SaveCardInfobarModalOverlayMediatorTest : public PlatformTest {
public:
SaveCardInfobarModalOverlayMediatorTest()
: prefs_(autofill::test::PrefServiceForTesting()),
callback_installer_(&callback_receiver_,
{SaveCardMainAction::ResponseSupport()}),
mediator_delegate_(
OCMStrictProtocolMock(@protocol(OverlayRequestMediatorDelegate))) {
scoped_feature_list_.InitWithFeatures({kIOSInfobarUIReboot},
{kInfobarUIRebootOnlyiOS13});
autofill::LegalMessageLines legal_message_lines =
autofill::LegalMessageLines(
{autofill::TestLegalMessageLine("Test message")});
std::unique_ptr<autofill::AutofillSaveCardInfoBarDelegateMobile> delegate =
std::make_unique<autofill::AutofillSaveCardInfoBarDelegateMobile>(
/*upload=*/true, autofill::AutofillClient::SaveCreditCardOptions(),
autofill::CreditCard(base::GenerateGUID(),
"https://www.example.com/"),
legal_message_lines,
base::BindOnce(
^(autofill::AutofillClient::SaveCardOfferUserDecision
user_decision,
const autofill::AutofillClient::UserProvidedCardDetails&
user_provided_card_details){
}),
autofill::AutofillClient::LocalSaveCardPromptCallback(),
prefs_.get());
delegate_ = delegate.get();
infobar_ = std::make_unique<InfoBarIOS>(InfobarType::kInfobarTypeSaveCard,
std::move(delegate));
request_ = OverlayRequest::CreateWithConfig<SaveCardModalRequestConfig>(
infobar_.get());
callback_installer_.InstallCallbacks(request_.get());
mediator_ = [[SaveCardInfobarModalOverlayMediator alloc]
initWithRequest:request_.get()];
mediator_.delegate = mediator_delegate_;
}
~SaveCardInfobarModalOverlayMediatorTest() override {
EXPECT_CALL(callback_receiver_, CompletionCallback(request_.get()));
EXPECT_OCMOCK_VERIFY(mediator_delegate_);
}
protected:
base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<PrefService> prefs_;
autofill::AutofillSaveCardInfoBarDelegateMobile* delegate_;
std::unique_ptr<InfoBarIOS> infobar_;
MockOverlayRequestCallbackReceiver callback_receiver_;
FakeOverlayRequestCallbackInstaller callback_installer_;
std::unique_ptr<OverlayRequest> request_;
SaveCardInfobarModalOverlayMediator* mediator_ = nil;
id<OverlayRequestMediatorDelegate> mediator_delegate_ = nil;
};
// Tests that a SaveCardInfobarModalOverlayMediator correctly sets up its
// consumer.
TEST_F(SaveCardInfobarModalOverlayMediatorTest, SetUpConsumer) {
FakeSaveCardModalConsumer* consumer =
[[FakeSaveCardModalConsumer alloc] init];
mediator_.consumer = consumer;
NSString* cardNumber = [NSString
stringWithFormat:@"•••• %@", base::SysUTF16ToNSString(
delegate_->card_last_four_digits())];
EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->cardholder_name()),
consumer.cardholderName);
EXPECT_NSEQ(cardNumber, consumer.cardNumber);
EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->expiration_date_month()),
consumer.expirationMonth);
EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->expiration_date_year()),
consumer.expirationYear);
EXPECT_FALSE(consumer.currentCardSaved);
EXPECT_TRUE(consumer.supportsEditing);
ASSERT_EQ(1U, [consumer.legalMessages count]);
EXPECT_NSEQ(@"Test message", consumer.legalMessages[0].messageText);
}
// Tests that calling saveCardWithCardholderName:expirationMonth:expirationYear:
// triggers a SaveCardMainAction response.
TEST_F(SaveCardInfobarModalOverlayMediatorTest, MainAction) {
EXPECT_CALL(
callback_receiver_,
DispatchCallback(request_.get(), SaveCardMainAction::ResponseSupport()));
OCMExpect([mediator_delegate_ stopOverlayForMediator:mediator_]);
[mediator_ saveCardWithCardholderName:@"name"
expirationMonth:@"3"
expirationYear:@"23"];
}
// Tests that calling dismissModalAndOpenURL: sends the passed URL to the
// mediator's save_card_delegate.
TEST_F(SaveCardInfobarModalOverlayMediatorTest, LoadURL) {
FakeSaveCardMediatorDelegate* delegate =
[[FakeSaveCardMediatorDelegate alloc] init];
mediator_.save_card_delegate = delegate;
GURL url("https://testurl.com");
OCMExpect([mediator_delegate_ stopOverlayForMediator:mediator_]);
[mediator_ dismissModalAndOpenURL:url];
EXPECT_NSEQ(base::SysUTF8ToNSString(url.spec()),
base::SysUTF8ToNSString(delegate.pendingURLToLoad.spec()));
}
...@@ -294,6 +294,7 @@ test("ios_chrome_unittests") { ...@@ -294,6 +294,7 @@ test("ios_chrome_unittests") {
"//ios/chrome/browser/ui/overlays/infobar_banner/translate:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner/translate:unit_tests",
"//ios/chrome/browser/ui/overlays/infobar_modal:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_modal:unit_tests",
"//ios/chrome/browser/ui/overlays/infobar_modal/passwords:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_modal/passwords:unit_tests",
"//ios/chrome/browser/ui/overlays/infobar_modal/save_card:unit_tests",
"//ios/chrome/browser/ui/overlays/infobar_modal/translate:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_modal/translate:unit_tests",
"//ios/chrome/browser/ui/overlays/test_modality:unit_tests", "//ios/chrome/browser/ui/overlays/test_modality:unit_tests",
"//ios/chrome/browser/ui/overlays/web_content_area/alerts:unit_tests", "//ios/chrome/browser/ui/overlays/web_content_area/alerts:unit_tests",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment