Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Unified Diff: ios/chrome/browser/ui/infobars/infobar_egtest.mm

Issue 2590473002: Upstream Chrome on iOS source code [5/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/chrome/browser/ui/icons/chrome_icon_unittest.mm ('k') | ios/chrome/browser/ui/infobars/infobar_view.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ios/chrome/browser/ui/icons/chrome_icon_unittest.mm ('k') | ios/chrome/browser/ui/infobars/infobar_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698