| // Copyright 2016 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/test/earl_grey/chrome_matchers.h" |
| |
| #import <OCHamcrest/OCHamcrest.h> |
| |
| #import <WebKit/WebKit.h> |
| |
| #include "base/mac/foundation_util.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "components/strings/grit/components_strings.h" |
| #include "components/unified_consent/feature.h" |
| #import "ios/chrome/browser/ui/authentication/signin_promo_view.h" |
| #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" |
| #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h" |
| #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h" |
| #import "ios/chrome/browser/ui/location_bar/location_bar_steady_view.h" |
| #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h" |
| #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller.h" |
| #import "ios/chrome/browser/ui/payments/payment_request_error_view_controller.h" |
| #import "ios/chrome/browser/ui/payments/payment_request_picker_view_controller.h" |
| #import "ios/chrome/browser/ui/payments/payment_request_view_controller.h" |
| #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" |
| #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h" |
| #import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_switch_item.h" |
| #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h" |
| #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h" |
| #import "ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/clear_browsing_data_ui_constants.h" |
| #import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h" |
| #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h" |
| #import "ios/chrome/browser/ui/util/uikit_ui_util.h" |
| #include "ios/chrome/grit/ios_strings.h" |
| #import "ios/chrome/test/app/chrome_test_util.h" |
| #import "ios/web/public/block_types.h" |
| #import "ios/web/public/test/earl_grey/web_view_matchers.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/test/ios/ui_image_test_utils.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace { |
| |
| // TODO(crbug.com/894800): Remove |use_new_cell|. |
| id<GREYMatcher> SettingsSwitchIsToggledOn(BOOL is_toggled_on, |
| BOOL use_new_cell) { |
| MatchesBlock matches = ^BOOL(id element) { |
| UISwitch* switch_view; |
| if (use_new_cell) { |
| SettingsSwitchCell* switch_cell = |
| base::mac::ObjCCastStrict<SettingsSwitchCell>(element); |
| switch_view = switch_cell.switchView; |
| } else { |
| LegacySettingsSwitchCell* switch_cell = |
| base::mac::ObjCCastStrict<LegacySettingsSwitchCell>(element); |
| switch_view = switch_cell.switchView; |
| } |
| return (switch_view.on && is_toggled_on) || |
| (!switch_view.on && !is_toggled_on); |
| }; |
| DescribeToBlock describe = ^void(id<GREYDescription> description) { |
| NSString* name = |
| [NSString stringWithFormat:@"settingsSwitchToggledState(%@)", |
| is_toggled_on ? @"ON" : @"OFF"]; |
| [description appendText:name]; |
| }; |
| return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| descriptionBlock:describe]; |
| } |
| |
| // TODO(crbug.com/894800): Remove |use_new_cell|. |
| id<GREYMatcher> SettingsSwitchIsEnabled(BOOL is_enabled, BOOL use_new_cell) { |
| MatchesBlock matches = ^BOOL(id element) { |
| UISwitch* switch_view; |
| if (use_new_cell) { |
| SettingsSwitchCell* switch_cell = |
| base::mac::ObjCCastStrict<SettingsSwitchCell>(element); |
| switch_view = switch_cell.switchView; |
| } else { |
| LegacySettingsSwitchCell* switch_cell = |
| base::mac::ObjCCastStrict<LegacySettingsSwitchCell>(element); |
| switch_view = switch_cell.switchView; |
| } |
| return (switch_view.enabled && is_enabled) || |
| (!switch_view.enabled && !is_enabled); |
| }; |
| DescribeToBlock describe = ^void(id<GREYDescription> description) { |
| NSString* name = |
| [NSString stringWithFormat:@"settingsSwitchEnabledState(%@)", |
| is_enabled ? @"YES" : @"NO"]; |
| [description appendText:name]; |
| }; |
| return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| descriptionBlock:describe]; |
| } |
| |
| } // namespace |
| |
| namespace chrome_test_util { |
| |
| id<GREYMatcher> ButtonWithAccessibilityLabel(NSString* label) { |
| return grey_allOf(grey_accessibilityLabel(label), |
| grey_accessibilityTrait(UIAccessibilityTraitButton), nil); |
| } |
| |
| id<GREYMatcher> ButtonWithAccessibilityLabelId(int message_id) { |
| return ButtonWithAccessibilityLabel( |
| l10n_util::GetNSStringWithFixup(message_id)); |
| } |
| |
| id<GREYMatcher> ImageViewWithImageNamed(NSString* imageName) { |
| UIImage* expected_image = [UIImage imageNamed:imageName]; |
| MatchesBlock matches = ^BOOL(UIImageView* imageView) { |
| return ui::test::uiimage_utils::UIImagesAreEqual(expected_image, |
| imageView.image); |
| }; |
| NSString* description_string = |
| [NSString stringWithFormat:@"Images matching image named %@", imageName]; |
| DescribeToBlock describe = ^(id<GREYDescription> description) { |
| [description appendText:description_string]; |
| }; |
| id<GREYMatcher> image_matcher = |
| [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| descriptionBlock:describe]; |
| return image_matcher; |
| } |
| |
| id<GREYMatcher> ImageViewWithImage(int image_id) { |
| UIImage* expected_image = NativeImage(image_id); |
| MatchesBlock matches = ^BOOL(UIImageView* imageView) { |
| return ui::test::uiimage_utils::UIImagesAreEqual(expected_image, |
| imageView.image); |
| }; |
| NSString* description_string = |
| [NSString stringWithFormat:@"Images matching %i", image_id]; |
| DescribeToBlock describe = ^(id<GREYDescription> description) { |
| [description appendText:description_string]; |
| }; |
| id<GREYMatcher> image_matcher = |
| [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| descriptionBlock:describe]; |
| return image_matcher; |
| } |
| |
| id<GREYMatcher> ButtonWithImage(int image_id) { |
| UIImage* expected_image = NativeImage(image_id); |
| MatchesBlock matches = ^BOOL(UIButton* button) { |
| return ui::test::uiimage_utils::UIImagesAreEqual(expected_image, |
| [button currentImage]); |
| }; |
| NSString* description_string = |
| [NSString stringWithFormat:@"Images matching %i", image_id]; |
| DescribeToBlock describe = ^(id<GREYDescription> description) { |
| [description appendText:description_string]; |
| }; |
| id<GREYMatcher> image_matcher = |
| [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| descriptionBlock:describe]; |
| return grey_allOf(grey_accessibilityTrait(UIAccessibilityTraitButton), |
| image_matcher, nil); |
| } |
| |
| id<GREYMatcher> StaticTextWithAccessibilityLabel(NSString* label) { |
| return grey_allOf(grey_accessibilityLabel(label), |
| grey_accessibilityTrait(UIAccessibilityTraitStaticText), |
| nil); |
| } |
| |
| id<GREYMatcher> StaticTextWithAccessibilityLabelId(int message_id) { |
| return StaticTextWithAccessibilityLabel( |
| l10n_util::GetNSStringWithFixup(message_id)); |
| } |
| |
| id<GREYMatcher> CancelButton() { |
| return ButtonWithAccessibilityLabelId(IDS_CANCEL); |
| } |
| |
| id<GREYMatcher> CloseButton() { |
| return ButtonWithAccessibilityLabelId(IDS_CLOSE); |
| } |
| |
| id<GREYMatcher> ForwardButton() { |
| return ButtonWithAccessibilityLabelId(IDS_ACCNAME_FORWARD); |
| } |
| |
| id<GREYMatcher> BackButton() { |
| return ButtonWithAccessibilityLabelId(IDS_ACCNAME_BACK); |
| } |
| |
| id<GREYMatcher> ReloadButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_ACCNAME_RELOAD); |
| } |
| |
| id<GREYMatcher> StopButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_ACCNAME_STOP); |
| } |
| |
| id<GREYMatcher> Omnibox() { |
| return grey_kindOfClass([OmniboxTextFieldIOS class]); |
| } |
| |
| id<GREYMatcher> DefocusedLocationView() { |
| return grey_kindOfClass([LocationBarSteadyView class]); |
| } |
| |
| id<GREYMatcher> PageSecurityInfoButton() { |
| return grey_accessibilityLabel(@"Page Security Info"); |
| } |
| |
| id<GREYMatcher> PageSecurityInfoIndicator() { |
| return grey_accessibilityLabel(@"Page Security Info"); |
| } |
| |
| id<GREYMatcher> OmniboxText(std::string text) { |
| return grey_allOf(Omnibox(), |
| hasProperty(@"text", base::SysUTF8ToNSString(text)), nil); |
| } |
| |
| id<GREYMatcher> OmniboxContainingText(std::string text) { |
| GREYElementMatcherBlock* matcher = [GREYElementMatcherBlock |
| matcherWithMatchesBlock:^BOOL(UITextField* element) { |
| return [element.text containsString:base::SysUTF8ToNSString(text)]; |
| } |
| descriptionBlock:^void(id<GREYDescription> description) { |
| [description |
| appendText:[NSString |
| stringWithFormat:@"Omnibox contains text \"%@\"", |
| base::SysUTF8ToNSString(text)]]; |
| }]; |
| return matcher; |
| } |
| |
| id<GREYMatcher> LocationViewContainingText(std::string text) { |
| GREYElementMatcherBlock* matcher = [GREYElementMatcherBlock |
| matcherWithMatchesBlock:^BOOL(LocationBarSteadyView* element) { |
| return [element.locationLabel.text |
| containsString:base::SysUTF8ToNSString(text)]; |
| } |
| descriptionBlock:^void(id<GREYDescription> description) { |
| [description |
| appendText:[NSString |
| stringWithFormat: |
| @"LocationBarSteadyView contains text \"%@\"", |
| base::SysUTF8ToNSString(text)]]; |
| }]; |
| return matcher; |
| } |
| |
| id<GREYMatcher> ToolsMenuButton() { |
| return grey_allOf(grey_accessibilityID(kToolbarToolsMenuButtonIdentifier), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> ShareButton() { |
| return grey_allOf(ButtonWithAccessibilityLabelId(IDS_IOS_TOOLS_MENU_SHARE), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> TabletTabSwitcherOpenButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_TAB_STRIP_ENTER_TAB_SWITCHER); |
| } |
| |
| id<GREYMatcher> ShowTabsButton() { |
| return grey_allOf(grey_accessibilityID(kToolbarStackButtonIdentifier), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> SettingsSwitchCell(NSString* accessibility_identifier, |
| BOOL is_toggled_on) { |
| return SettingsSwitchCell(accessibility_identifier, is_toggled_on, YES); |
| } |
| |
| id<GREYMatcher> SettingsSwitchCell(NSString* accessibility_identifier, |
| BOOL is_toggled_on, |
| BOOL is_enabled) { |
| return grey_allOf(grey_accessibilityID(accessibility_identifier), |
| SettingsSwitchIsToggledOn(is_toggled_on, YES), |
| SettingsSwitchIsEnabled(is_enabled, YES), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> LegacySettingsSwitchCell(NSString* accessibility_identifier, |
| BOOL is_toggled_on) { |
| return LegacySettingsSwitchCell(accessibility_identifier, is_toggled_on, YES); |
| } |
| |
| id<GREYMatcher> LegacySettingsSwitchCell(NSString* accessibility_identifier, |
| BOOL is_toggled_on, |
| BOOL is_enabled) { |
| return grey_allOf(grey_accessibilityID(accessibility_identifier), |
| SettingsSwitchIsToggledOn(is_toggled_on, NO), |
| SettingsSwitchIsEnabled(is_enabled, NO), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> SyncSwitchCell(NSString* accessibilityLabel, |
| BOOL is_toggled_on) { |
| return grey_allOf( |
| grey_accessibilityLabel(accessibilityLabel), |
| grey_accessibilityValue( |
| is_toggled_on ? l10n_util::GetNSString(IDS_IOS_SETTING_ON) |
| : l10n_util::GetNSString(IDS_IOS_SETTING_OFF)), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> OpenLinkInNewTabButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB); |
| } |
| |
| id<GREYMatcher> NavigationBarDoneButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| id<GREYMatcher> BookmarksNavigationBarDoneButton() { |
| return grey_accessibilityID(kBookmarkHomeNavigationBarDoneButtonIdentifier); |
| } |
| |
| id<GREYMatcher> AccountConsistencySetupSigninButton() { |
| return ButtonWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| } |
| |
| id<GREYMatcher> AccountConsistencyConfirmationOkButton() { |
| int labelID = base::FeatureList::IsEnabled(unified_consent::kUnifiedConsent) |
| ? IDS_IOS_ACCOUNT_UNIFIED_CONSENT_OK_BUTTON |
| : IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON; |
| return ButtonWithAccessibilityLabelId(labelID); |
| } |
| |
| id<GREYMatcher> AddAccountButton() { |
| return grey_accessibilityID(kSettingsAccountsAddAccountCellId); |
| } |
| |
| id<GREYMatcher> SignOutAccountsButton() { |
| return grey_accessibilityID(kSettingsAccountsSignoutCellId); |
| } |
| |
| id<GREYMatcher> ClearBrowsingDataCollectionView() { |
| return grey_accessibilityID( |
| kClearBrowsingDataCollectionViewAccessibilityIdentifier); |
| } |
| |
| id<GREYMatcher> ConfirmClearBrowsingDataButton() { |
| return grey_allOf( |
| grey_accessibilityLabel(l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON)), |
| grey_accessibilityTrait(UIAccessibilityTraitButton), |
| grey_not(grey_accessibilityID(kClearBrowsingDataButtonIdentifier)), nil); |
| } |
| |
| id<GREYMatcher> SettingsMenuButton() { |
| return grey_accessibilityID(kToolsMenuSettingsId); |
| } |
| |
| id<GREYMatcher> SettingsDoneButton() { |
| return grey_accessibilityID(kSettingsDoneButtonId); |
| } |
| |
| id<GREYMatcher> ToolsMenuView() { |
| return grey_accessibilityID(kPopupMenuToolsMenuTableViewId); |
| } |
| |
| id<GREYMatcher> OKButton() { |
| return ButtonWithAccessibilityLabelId(IDS_OK); |
| } |
| |
| id<GREYMatcher> PrimarySignInButton() { |
| return grey_accessibilityID(kSigninPromoPrimaryButtonId); |
| } |
| |
| id<GREYMatcher> SecondarySignInButton() { |
| return grey_accessibilityID(kSigninPromoSecondaryButtonId); |
| } |
| |
| id<GREYMatcher> SettingsAccountButton() { |
| return grey_accessibilityID(kSettingsAccountCellId); |
| } |
| |
| id<GREYMatcher> SettingsAccountsCollectionView() { |
| return grey_accessibilityID(kSettingsAccountsId); |
| } |
| |
| id<GREYMatcher> SettingsImportDataImportButton() { |
| return grey_accessibilityID(kImportDataImportCellId); |
| } |
| |
| id<GREYMatcher> SettingsImportDataKeepSeparateButton() { |
| return grey_accessibilityID(kImportDataKeepSeparateCellId); |
| } |
| |
| id<GREYMatcher> SettingsSyncManageSyncedDataButton() { |
| return grey_accessibilityID(kSettingsSyncId); |
| } |
| |
| id<GREYMatcher> AccountsSyncButton() { |
| return grey_allOf(grey_accessibilityID(kSettingsAccountsSyncCellId), |
| grey_sufficientlyVisible(), nil); |
| } |
| |
| id<GREYMatcher> ContentSettingsButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_CONTENT_SETTINGS_TITLE); |
| } |
| |
| id<GREYMatcher> GoogleServicesSettingsButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE); |
| } |
| |
| id<GREYMatcher> SettingsMenuBackButton() { |
| return grey_allOf(grey_accessibilityID(@"ic_arrow_back"), |
| grey_accessibilityTrait(UIAccessibilityTraitButton), nil); |
| } |
| |
| id<GREYMatcher> SettingsMenuPrivacyButton() { |
| return ButtonWithAccessibilityLabelId( |
| IDS_OPTIONS_ADVANCED_SECTION_TITLE_PRIVACY); |
| } |
| |
| id<GREYMatcher> SettingsMenuPasswordsButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_PASSWORDS); |
| } |
| |
| id<GREYMatcher> PaymentRequestView() { |
| return grey_accessibilityID(kPaymentRequestCollectionViewID); |
| } |
| |
| // Returns matcher for the error confirmation view for payment request. |
| id<GREYMatcher> PaymentRequestErrorView() { |
| return grey_accessibilityID(kPaymentRequestErrorCollectionViewID); |
| } |
| |
| id<GREYMatcher> VoiceSearchButton() { |
| return grey_allOf(grey_accessibilityID(kSettingsVoiceSearchCellId), |
| grey_accessibilityTrait(UIAccessibilityTraitButton), nil); |
| } |
| |
| id<GREYMatcher> SettingsCollectionView() { |
| return grey_accessibilityID(kSettingsCollectionViewId); |
| } |
| |
| id<GREYMatcher> ClearBrowsingHistoryButton() { |
| return grey_accessibilityID(kClearBrowsingHistoryCellAccessibilityIdentifier); |
| } |
| |
| id<GREYMatcher> ClearCookiesButton() { |
| return grey_accessibilityID(kClearCookiesCellAccessibilityIdentifier); |
| } |
| |
| id<GREYMatcher> ClearCacheButton() { |
| return grey_accessibilityID(kClearCacheCellAccessibilityIdentifier); |
| } |
| |
| id<GREYMatcher> ClearSavedPasswordsButton() { |
| return grey_accessibilityID(kClearSavedPasswordsCellAccessibilityIdentifier); |
| } |
| |
| id<GREYMatcher> ContentSuggestionCollectionView() { |
| return grey_accessibilityID( |
| [ContentSuggestionsViewController collectionAccessibilityIdentifier]); |
| } |
| |
| id<GREYMatcher> WarningMessageView() { |
| return grey_accessibilityID(kWarningMessageAccessibilityID); |
| } |
| |
| id<GREYMatcher> PaymentRequestPickerRow() { |
| return grey_accessibilityID(kPaymentRequestPickerRowAccessibilityID); |
| } |
| |
| id<GREYMatcher> PaymentRequestPickerSearchBar() { |
| return grey_accessibilityID(kPaymentRequestPickerSearchBarAccessibilityID); |
| } |
| |
| id<GREYMatcher> BookmarksMenuButton() { |
| return grey_accessibilityID(kToolsMenuBookmarksId); |
| } |
| |
| id<GREYMatcher> RecentTabsMenuButton() { |
| return grey_accessibilityID(kToolsMenuOtherDevicesId); |
| } |
| |
| id<GREYMatcher> SystemSelectionCallout() { |
| return grey_kindOfClass(NSClassFromString(@"UICalloutBarButton")); |
| } |
| |
| id<GREYMatcher> SystemSelectionCalloutCopyButton() { |
| return grey_accessibilityLabel(@"Copy"); |
| } |
| |
| id<GREYMatcher> ContextMenuCopyButton() { |
| return ButtonWithAccessibilityLabelId(IDS_IOS_CONTENT_CONTEXT_COPY); |
| } |
| |
| id<GREYMatcher> NewTabPageOmnibox() { |
| return grey_allOf( |
| grey_accessibilityLabel(l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT)), |
| grey_minimumVisiblePercent(0.2), nil); |
| } |
| |
| id<GREYMatcher> WebViewMatcher() { |
| return web::WebViewInWebState(chrome_test_util::GetCurrentWebState()); |
| } |
| |
| } // namespace chrome_test_util |