OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import <EarlGrey/EarlGrey.h> |
| 6 #import <XCTest/XCTest.h> |
| 7 |
| 8 #include "base/ios/ios_util.h" |
| 9 #include "components/strings/grit/components_strings.h" |
| 10 #include "ios/chrome/browser/ui/tools_menu/tools_menu_constants.h" |
| 11 #import "ios/chrome/test/app/chrome_test_util.h" |
| 12 #import "ios/chrome/test/app/navigation_test_util.h" |
| 13 #import "ios/chrome/test/earl_grey/chrome_assertions.h" |
| 14 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" |
| 15 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" |
| 16 #import "ios/chrome/test/earl_grey/chrome_matchers.h" |
| 17 #import "ios/chrome/test/earl_grey/chrome_test_case.h" |
| 18 #import "ios/web/public/test/http_server/http_server.h" |
| 19 #include "ios/web/public/test/http_server/http_server_util.h" |
| 20 #include "ui/base/l10n/l10n_util_mac.h" |
| 21 |
| 22 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 23 #error "This file requires ARC support." |
| 24 #endif |
| 25 |
| 26 namespace { |
| 27 // Returns matcher that looks for text in UILabel, UITextView, and UITextField |
| 28 // objects, checking if their displayed strings contain the provided |text|. |
| 29 id<GREYMatcher> ContainsText(NSString* text) { |
| 30 MatchesBlock matches = ^BOOL(id element) { |
| 31 return [[element text] containsString:text]; |
| 32 }; |
| 33 DescribeToBlock describe = ^void(id<GREYDescription> description) { |
| 34 [description appendText:[NSString stringWithFormat:@"hasText('%@')", text]]; |
| 35 }; |
| 36 id<GREYMatcher> matcher = |
| 37 [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches |
| 38 descriptionBlock:describe]; |
| 39 return grey_allOf(grey_anyOf(grey_kindOfClass([UILabel class]), |
| 40 grey_kindOfClass([UITextField class]), |
| 41 grey_kindOfClass([UITextView class]), nil), |
| 42 matcher, nil); |
| 43 } |
| 44 |
| 45 // A matcher for the main title of the Sad Tab in 'reload' mode. |
| 46 id<GREYMatcher> reloadSadTabTitleText() { |
| 47 static id matcher = nil; |
| 48 static dispatch_once_t onceToken; |
| 49 dispatch_once(&onceToken, ^{ |
| 50 matcher = [GREYMatchers |
| 51 matcherForText:l10n_util::GetNSString(IDS_SAD_TAB_MESSAGE)]; |
| 52 }); |
| 53 return matcher; |
| 54 } |
| 55 |
| 56 // A matcher for the main title of the Sad Tab in 'feedback' mode. |
| 57 id<GREYMatcher> feedbackSadTabTitleContainsText() { |
| 58 static id matcher = nil; |
| 59 static dispatch_once_t onceToken; |
| 60 dispatch_once(&onceToken, ^{ |
| 61 matcher = ContainsText(l10n_util::GetNSString(IDS_SAD_TAB_RELOAD_TRY)); |
| 62 }); |
| 63 return matcher; |
| 64 } |
| 65 |
| 66 // A matcher for a help string suggesting the user use Incognito Mode. |
| 67 id<GREYMatcher> incognitoHelpContainsText() { |
| 68 static id matcher = nil; |
| 69 static dispatch_once_t onceToken; |
| 70 dispatch_once(&onceToken, ^{ |
| 71 matcher = |
| 72 ContainsText(l10n_util::GetNSString(IDS_SAD_TAB_RELOAD_INCOGNITO)); |
| 73 }); |
| 74 return matcher; |
| 75 } |
| 76 } |
| 77 |
| 78 // Sad Tab View integration tests for Chrome. |
| 79 @interface SadTabViewTestCase : ChromeTestCase |
| 80 @end |
| 81 |
| 82 @implementation SadTabViewTestCase |
| 83 |
| 84 // Verifies initial and repeated visits to the Sad Tab. |
| 85 // N.B. There is a mechanism which changes the Sad Tab UI if a crash URL is |
| 86 // visited within 60 seconds, for this reason this one test can not |
| 87 // be easily split up across multiple tests |
| 88 // as visiting Sad Tab may not be idempotent. |
| 89 - (void)testSadTabView { |
| 90 // Prepare a simple but known URL to avoid testing from the NTP. |
| 91 web::test::SetUpFileBasedHttpServer(); |
| 92 const GURL simple_URL = web::test::HttpServer::MakeUrl( |
| 93 "http://ios/testing/data/http_server_files/destination.html"); |
| 94 |
| 95 // Prepare a helper block to test Sad Tab navigating from and to normal pages. |
| 96 void (^loadAndCheckSimpleURL)() = ^void() { |
| 97 [ChromeEarlGrey loadURL:simple_URL]; |
| 98 [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]; |
| 99 [[EarlGrey selectElementWithMatcher:reloadSadTabTitleText()] |
| 100 assertWithMatcher:grey_nil()]; |
| 101 [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()] |
| 102 assertWithMatcher:grey_nil()]; |
| 103 }; |
| 104 |
| 105 loadAndCheckSimpleURL(); |
| 106 |
| 107 // Navigate to the chrome://crash URL which should show the Sad Tab. |
| 108 // Use chrome_test_util::LoadURL() directly to avoid ChomeEarlGrey helper |
| 109 // methods which expect to wait for web content. |
| 110 const GURL crash_URL = GURL("chrome://crash"); |
| 111 chrome_test_util::LoadUrl(crash_URL); |
| 112 [[EarlGrey selectElementWithMatcher:reloadSadTabTitleText()] |
| 113 assertWithMatcher:grey_notNil()]; |
| 114 |
| 115 // Ensure user can navigate away from Sad Tab, and the Sad Tab content |
| 116 // is no longer visible. |
| 117 loadAndCheckSimpleURL(); |
| 118 |
| 119 // A second visit to the crashing URL should show a feedback message. |
| 120 // It should also show help messages including an invitation to use |
| 121 // Incognito Mode. |
| 122 chrome_test_util::LoadUrl(crash_URL); |
| 123 [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()] |
| 124 assertWithMatcher:grey_notNil()]; |
| 125 [[EarlGrey selectElementWithMatcher:incognitoHelpContainsText()] |
| 126 assertWithMatcher:grey_notNil()]; |
| 127 |
| 128 // Again ensure a user can navigate away from Sad Tab, and the Sad Tab content |
| 129 // is no longer visible. |
| 130 loadAndCheckSimpleURL(); |
| 131 |
| 132 // Open an Incognito tab and browse somewhere, the repeated crash UI changes |
| 133 // dependent on the Incognito mode. |
| 134 [ChromeEarlGreyUI openToolsMenu]; |
| 135 id<GREYMatcher> newIncognitoTabButtonMatcher = |
| 136 grey_accessibilityID(kToolsMenuNewIncognitoTabId); |
| 137 [[EarlGrey selectElementWithMatcher:newIncognitoTabButtonMatcher] |
| 138 performAction:grey_tap()]; |
| 139 chrome_test_util::AssertIncognitoTabCount(1); |
| 140 loadAndCheckSimpleURL(); |
| 141 |
| 142 // Test an initial crash, and then a second crash in Incognito mode, as above. |
| 143 // Incognito mode should not be suggested if already in Incognito mode. |
| 144 chrome_test_util::LoadUrl(crash_URL); |
| 145 [[EarlGrey selectElementWithMatcher:reloadSadTabTitleText()] |
| 146 assertWithMatcher:grey_notNil()]; |
| 147 chrome_test_util::LoadUrl(crash_URL); |
| 148 [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()] |
| 149 assertWithMatcher:grey_notNil()]; |
| 150 [[EarlGrey selectElementWithMatcher:incognitoHelpContainsText()] |
| 151 assertWithMatcher:grey_nil()]; |
| 152 |
| 153 // Finally, ensure that the user can browse away from the Sad Tab page |
| 154 // in Incognito Mode. |
| 155 loadAndCheckSimpleURL(); |
| 156 } |
| 157 |
| 158 @end |
OLD | NEW |