| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "base/functional/bind.h" |
| #import "base/ios/ios_util.h" |
| #import "base/test/ios/wait_util.h" |
| #import "components/feature_engagement/public/feature_constants.h" |
| #import "components/strings/grit/components_strings.h" |
| #import "ios/chrome/browser/infobars/ui_bundled/banners/infobar_banner_constants.h" |
| #import "ios/chrome/browser/shared/public/features/features.h" |
| #import "ios/chrome/grit/ios_branded_strings.h" |
| #import "ios/chrome/grit/ios_strings.h" |
| #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" |
| #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" |
| #import "ios/chrome/test/earl_grey/chrome_test_case.h" |
| #import "ios/chrome/test/earl_grey/test_switches.h" |
| #import "ios/testing/earl_grey/app_launch_manager.h" |
| #import "ios/testing/earl_grey/earl_grey_test.h" |
| #import "net/test/embedded_test_server/embedded_test_server.h" |
| #import "net/test/embedded_test_server/http_request.h" |
| #import "net/test/embedded_test_server/http_response.h" |
| #import "ui/base/l10n/l10n_util_mac.h" |
| |
| using base::test::ios::kWaitForDownloadTimeout; |
| using base::test::ios::WaitUntilConditionOrTimeout; |
| |
| namespace { |
| |
| // Wait for 2 seconds longer than the default promo show time, in case it's |
| // slightly delayed. |
| constexpr base::TimeDelta kShowPromoWebpageLoadWaitTime = base::Seconds(5); |
| |
| // Returns a matcher for the non modal promo title. |
| id<GREYMatcher> NonModalTitleMatcher() { |
| NSString* a11yLabelText = |
| l10n_util::GetNSString(IDS_IOS_DEFAULT_BROWSER_NON_MODAL_TITLE); |
| return grey_accessibilityLabel(a11yLabelText); |
| } |
| |
| } // namespace |
| |
| // Tests Non Modal Default Promo. |
| @interface NonModalEGTest : ChromeTestCase |
| @end |
| |
| @implementation NonModalEGTest |
| |
| - (void)setUp { |
| [super setUp]; |
| |
| AppLaunchConfiguration config; |
| config.relaunch_policy = ForceRelaunchByCleanShutdown; |
| config.additional_args.push_back( |
| std::string("-") + test_switches::kEnableIPH + |
| "=IPH_iOSPromoNonModalUrlPasteDefaultBrowser"); |
| [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; |
| |
| GREYAssertTrue(self.testServer->Start(), @"Server did not start."); |
| [ChromeEarlGrey clearDefaultBrowserPromoData]; |
| } |
| |
| - (void)tearDownHelper { |
| [super tearDownHelper]; |
| [ChromeEarlGrey clearDefaultBrowserPromoData]; |
| } |
| |
| // Test that a non modal default modal promo appears when it is triggered by |
| // using the share menu. |
| - (void)testNonModalAppears { |
| const GURL destinationUrl = self.testServer->GetURL("/destination.html"); |
| [ChromeEarlGrey loadURL:destinationUrl]; |
| |
| [ChromeEarlGreyUI openShareMenu]; |
| |
| // Verify that the share menu is up and contains a Copy action. |
| [ChromeEarlGrey verifyActivitySheetVisible]; |
| // Start the Copy action and verify that the share menu gets dismissed. |
| [ChromeEarlGrey tapButtonInActivitySheetWithID:@"Copy"]; |
| [ChromeEarlGrey verifyActivitySheetNotVisible]; |
| |
| // Wait until the promo appears. |
| NSString* description = @"Wait for the promo to appear."; |
| ConditionBlock condition = ^{ |
| NSError* error = nil; |
| [[EarlGrey selectElementWithMatcher:NonModalTitleMatcher()] |
| assertWithMatcher:grey_sufficientlyVisible() |
| error:&error]; |
| return (error == nil); |
| }; |
| GREYAssert( |
| WaitUntilConditionOrTimeout(kShowPromoWebpageLoadWaitTime, condition), |
| description); |
| } |
| |
| @end |