Index: ios/chrome/browser/ui/infobars/infobar_egtest.mm |
diff --git a/ios/chrome/browser/ui/infobars/infobar_egtest.mm b/ios/chrome/browser/ui/infobars/infobar_egtest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..687f6c8e0609d2e0cb03306a4474541fc1d4b9e5 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/infobars/infobar_egtest.mm |
@@ -0,0 +1,171 @@ |
+// 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 <EarlGrey/EarlGrey.h> |
+#import <XCTest/XCTest.h> |
+ |
+#include "base/strings/sys_string_conversions.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "components/infobars/core/confirm_infobar_delegate.h" |
+#include "components/infobars/core/infobar.h" |
+#include "components/infobars/core/infobar_manager.h" |
+#import "ios/chrome/app/main_controller.h" |
+#import "ios/chrome/browser/tabs/tab.h" |
+#import "ios/chrome/browser/tabs/tab_model.h" |
+#import "ios/chrome/test/app/chrome_test_util.h" |
+#import "ios/chrome/test/app/tab_test_util.h" |
+#import "ios/chrome/test/earl_grey/chrome_assertions.h" |
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" |
+#import "ios/chrome/test/earl_grey/chrome_matchers.h" |
+#import "ios/chrome/test/earl_grey/chrome_test_case.h" |
+#import "ios/web/public/test/http_server.h" |
+#include "ios/web/public/test/http_server_util.h" |
+#include "url/gurl.h" |
+#include "url/url_constants.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace { |
+ |
+// The title of the test infobar. |
+const char kTestInfoBarTitle[] = "TestInfoBar"; |
+ |
+// Timeout for how long to wait for an infobar to appear or disapper. |
+const CFTimeInterval kTimeout = 4.0; |
+ |
+// An infobar that displays a single line of text and no buttons. |
+class TestInfoBarDelegate : public ConfirmInfoBarDelegate { |
+ public: |
+ static bool Create(infobars::InfoBarManager* infobar_manager); |
+ |
+ // InfoBarDelegate implementation. |
+ InfoBarIdentifier GetIdentifier() const override { return TEST_INFOBAR; } |
+ |
+ // ConfirmInfoBarDelegate implementation. |
+ base::string16 GetMessageText() const override { |
+ return base::ASCIIToUTF16(kTestInfoBarTitle); |
+ } |
+ |
+ int GetButtons() const override { |
+ return ConfirmInfoBarDelegate::BUTTON_NONE; |
+ } |
+}; |
+ |
+bool TestInfoBarDelegate::Create(infobars::InfoBarManager* infobar_manager) { |
+ DCHECK(infobar_manager); |
+ return !!infobar_manager->AddInfoBar(infobar_manager->CreateConfirmInfoBar( |
+ std::unique_ptr<ConfirmInfoBarDelegate>(new TestInfoBarDelegate))); |
+} |
+ |
+// Returns the InfoBarManager for the current tab. Only works in normal |
+// (non-incognito) mode. |
+infobars::InfoBarManager* GetCurrentInfoBarManager() { |
+ MainController* main_controller = chrome_test_util::GetMainController(); |
+ return [[[[main_controller browserViewInformation] mainTabModel] currentTab] |
+ infoBarManager]; |
+} |
+ |
+// Adds a TestInfoBar to the current tab. |
+bool AddTestInfoBarToCurrentTab() { |
+ infobars::InfoBarManager* manager = GetCurrentInfoBarManager(); |
+ return TestInfoBarDelegate::Create(manager); |
+} |
+ |
+// Verifies that a single TestInfoBar is either present or absent on the current |
+// tab. |
+void VerifyTestInfoBarVisibleForCurrentTab(bool visible) { |
+ // Expected values. |
+ bool expected_count = visible ? 1U : 0U; |
+ id<GREYMatcher> expected_visibility = |
+ visible ? grey_sufficientlyVisible() : grey_notVisible(); |
+ NSString* condition_name = |
+ visible ? @"Waiting for infobar to show" : @"Waiting for infobar to hide"; |
+ |
+ infobars::InfoBarManager* manager = GetCurrentInfoBarManager(); |
+ GREYAssertEqual(expected_count, manager->infobar_count(), |
+ @"Incorrect number of infobars."); |
+ [[GREYCondition |
+ conditionWithName:condition_name |
+ block:^BOOL { |
+ NSError* error = nil; |
+ [[EarlGrey |
+ selectElementWithMatcher: |
+ chrome_test_util::staticTextWithAccessibilityLabel( |
+ base::SysUTF8ToNSString(kTestInfoBarTitle))] |
+ assertWithMatcher:expected_visibility |
+ error:&error]; |
+ return error == nil; |
+ }] waitWithTimeout:kTimeout]; |
+} |
+ |
+} // namespace |
+ |
+// Tests functionality related to infobars. |
+@interface InfobarTestCase : ChromeTestCase |
+@end |
+ |
+@implementation InfobarTestCase |
+ |
+// Tests that page infobars don't persist on navigation. |
+- (void)testInfobarsDismissOnNavigate { |
+ web::test::SetUpFileBasedHttpServer(); |
+ |
+ // Open a new tab and navigate to the test page. |
+ const GURL testURL = web::test::HttpServer::MakeUrl( |
+ "http://ios/testing/data/http_server_files/pony.html"); |
+ [ChromeEarlGrey loadURL:testURL]; |
+ chrome_test_util::AssertMainTabCount(1U); |
+ |
+ // Add a test infobar to the current tab. Verify that the infobar is present |
+ // in the model and that the infobar view is visible on screen. |
+ GREYAssert(AddTestInfoBarToCurrentTab(), |
+ @"Failed to add infobar to test tab."); |
+ VerifyTestInfoBarVisibleForCurrentTab(true); |
+ |
+ // Navigate to a different page. Verify that the infobar is dismissed and no |
+ // longer visible on screen. |
+ [ChromeEarlGrey loadURL:GURL(url::kAboutBlankURL)]; |
+ VerifyTestInfoBarVisibleForCurrentTab(false); |
+} |
+ |
+// Tests that page infobars persist only on the tabs they are opened on, and |
+// that navigation in other tabs doesn't affect them. |
+- (void)testInfobarTabSwitch { |
+ const GURL destinationURL = web::test::HttpServer::MakeUrl( |
+ "http://ios/testing/data/http_server_files/destination.html"); |
+ const GURL ponyURL = web::test::HttpServer::MakeUrl( |
+ "http://ios/testing/data/http_server_files/pony.html"); |
+ web::test::SetUpFileBasedHttpServer(); |
+ |
+ // Create the first tab and navigate to the test page. |
+ [ChromeEarlGrey loadURL:destinationURL]; |
+ chrome_test_util::AssertMainTabCount(1U); |
+ |
+ // Create the second tab, navigate to the test page, and add the test infobar. |
+ chrome_test_util::OpenNewTab(); |
+ [ChromeEarlGrey loadURL:ponyURL]; |
+ chrome_test_util::AssertMainTabCount(2U); |
+ VerifyTestInfoBarVisibleForCurrentTab(false); |
+ GREYAssert(AddTestInfoBarToCurrentTab(), |
+ @"Failed to add infobar to second tab."); |
+ VerifyTestInfoBarVisibleForCurrentTab(true); |
+ |
+ // Switch back to the first tab and make sure no infobar is visible. |
+ chrome_test_util::SelectTabAtIndexInCurrentMode(0U); |
+ VerifyTestInfoBarVisibleForCurrentTab(false); |
+ |
+ // Navigate to a different URL in the first tab, to verify that this |
+ // navigation does not hide the infobar in the second tab. |
+ [ChromeEarlGrey loadURL:ponyURL]; |
+ |
+ // Close the first tab. Verify that there is only one tab remaining and its |
+ // infobar is visible. |
+ chrome_test_util::CloseCurrentTab(); |
+ chrome_test_util::AssertMainTabCount(1U); |
+ VerifyTestInfoBarVisibleForCurrentTab(true); |
+} |
+ |
+@end |