Index: ios/chrome/browser/ui/keyboard_commands_egtest.mm |
diff --git a/ios/chrome/browser/ui/keyboard_commands_egtest.mm b/ios/chrome/browser/ui/keyboard_commands_egtest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3a0f46fdac42b22daa9ae03f85044f37002dc514 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/keyboard_commands_egtest.mm |
@@ -0,0 +1,228 @@ |
+// 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 "components/strings/grit/components_strings.h" |
+#import "ios/chrome/browser/ui/browser_view_controller.h" |
+#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" |
+#include "ios/chrome/browser/ui/commands/ios_command_ids.h" |
+#import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h" |
+#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h" |
+#include "ios/chrome/browser/ui/ui_util.h" |
+#import "ios/chrome/browser/ui/uikit_ui_util.h" |
+#include "ios/chrome/grit/ios_strings.h" |
+#import "ios/chrome/test/app/bookmarks_test_util.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_earl_grey.h" |
+#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.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" |
+ |
+const CGFloat kScrollDisplacement = 50.0; |
+ |
+// Test cases to verify that keyboard commands are and are not registered when |
+// expected. |
+@interface KeyboardCommandsTestCase : ChromeTestCase |
+@end |
+ |
+@implementation KeyboardCommandsTestCase |
+ |
+#pragma mark - Helpers |
+ |
+// Verifies that keyboard commands are registered by the BVC. |
+- (void)verifyKeyboardCommandsAreRegistered { |
+ BOOL (^block) |
+ () = ^BOOL { |
+ return chrome_test_util::GetRegisteredKeyCommandsCount() > 0; |
+ }; |
+ |
+ GREYCondition* keyboardCommands = |
+ [GREYCondition conditionWithName:@"Keyboard commands registered" |
+ block:block]; |
+ |
+ BOOL success = [keyboardCommands waitWithTimeout:5]; |
+ if (!success) { |
+ GREYFail(@"No keyboard commands are registered."); |
+ } |
+} |
+ |
+// Verifies that no keyboard commands are registered by the BVC. |
+- (void)verifyNoKeyboardCommandsAreRegistered { |
+ BOOL (^block) |
+ () = ^BOOL { |
+ return chrome_test_util::GetRegisteredKeyCommandsCount() == 0; |
+ }; |
+ GREYCondition* noKeyboardCommands = |
+ [GREYCondition conditionWithName:@"No keyboard commands registered" |
+ block:block]; |
+ |
+ BOOL success = [noKeyboardCommands waitWithTimeout:5]; |
+ if (!success) { |
+ GREYFail(@"Some keyboard commands are registered."); |
+ } |
+} |
+ |
+// Verifies the internal state of the Bookmarks has loaded and is ready for use. |
+// TODO(crbug.com/638674): Evaluate if this can move to shared code. |
+- (void)verifyBookmarksLoaded { |
+ BOOL (^block) |
+ () = ^BOOL { |
+ return chrome_test_util::BookmarksLoaded(); |
+ }; |
+ GREYCondition* bookmarksDoneLoading = |
+ [GREYCondition conditionWithName:@"Waiting for bookmark model to load." |
+ block:block]; |
+ |
+ BOOL success = [bookmarksDoneLoading waitWithTimeout:5]; |
+ GREYAssert(success, @"The bookmark model was not loaded."); |
+} |
+ |
+// Waits for the bookmark editor to display. |
+// TODO(crbug.com/638674): Evaluate if this can move to shared code. |
+- (void)waitForSingleBookmarkEditorToDisplay { |
+ BOOL (^block) |
+ () = ^BOOL { |
+ NSError* error = nil; |
+ id<GREYMatcher> singleBookmarkEditor = |
+ grey_accessibilityLabel(@"Single Bookmark Editor"); |
+ [[EarlGrey selectElementWithMatcher:singleBookmarkEditor] |
+ assertWithMatcher:grey_sufficientlyVisible() |
+ error:&error]; |
+ return error != nil; |
+ }; |
+ GREYCondition* editorDisplayed = [GREYCondition |
+ conditionWithName:@"Waiting for bookmark editor to display." |
+ block:block]; |
+ |
+ BOOL success = [editorDisplayed waitWithTimeout:5]; |
+ GREYAssert(success, @"The bookmark editor was not displayed."); |
+} |
+ |
+// Open tools menu, find and tap on item specified by |toolsMenuItem| matcher. |
+// TODO(crbug.com/638674): Evaluate if this can move to shared code. |
+- (void)selectToolsMenuItem:(id<GREYMatcher>)toolsMenuItem { |
+ [ChromeEarlGreyUI openToolsMenu]; |
+ |
+ id<GREYMatcher> toolsMenuTableView = |
+ grey_accessibilityID(kToolsMenuTableViewId); |
+ [[[EarlGrey selectElementWithMatcher:toolsMenuItem] |
+ usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
+ kScrollDisplacement) |
+ onElementWithMatcher:toolsMenuTableView] performAction:grey_tap()]; |
+} |
+ |
+#pragma mark - Tests |
+ |
+// Tests that keyboard commands are registered when the BVC is showing without |
+// modals currently presented. |
+- (void)testKeyboardCommandsRegistered { |
+ [self verifyKeyboardCommandsAreRegistered]; |
+} |
+ |
+// Tests that keyboard commands are not registered when Settings are shown. |
+- (void)testKeyboardCommandsNotRegistered_SettingsPresented { |
+ // Open Settings |
+ id<GREYMatcher> toolsMenuSettings = |
+ grey_accessibilityID(kToolsMenuSettingsId); |
+ [self selectToolsMenuItem:toolsMenuSettings]; |
+ |
+ [self verifyNoKeyboardCommandsAreRegistered]; |
+ |
+ // Close Settings |
+ id<GREYMatcher> settingsDoneButton = |
+ chrome_test_util::buttonWithAccessibilityLabelId( |
+ IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
+ [[EarlGrey selectElementWithMatcher:settingsDoneButton] |
+ performAction:grey_tap()]; |
+} |
+ |
+// Tests that keyboard commands are not registered when the bookmark UI is |
+// shown. |
+- (void)testKeyboardCommandsNotRegistered_AddBookmarkPresented { |
+ [self verifyBookmarksLoaded]; |
+ BOOL success = chrome_test_util::ClearBookmarks(); |
+ GREYAssert(success, @"Not all bookmarks were removed."); |
+ |
+ // Bookmark page |
+ if (IsIPadIdiom()) { |
+ id<GREYMatcher> bookmarkMatcher = |
+ chrome_test_util::buttonWithAccessibilityLabelId(IDS_TOOLTIP_STAR); |
+ [[EarlGrey selectElementWithMatcher:bookmarkMatcher] |
+ performAction:grey_tap()]; |
+ } else { |
+ [ChromeEarlGreyUI openToolsMenu]; |
+ id<GREYMatcher> bookmarkMatcher = grey_accessibilityLabel(@"Add Bookmark"); |
+ [[EarlGrey selectElementWithMatcher:bookmarkMatcher] |
+ performAction:grey_tap()]; |
+ } |
+ |
+ // Tap on the HUD. |
+ id<GREYMatcher> edit = chrome_test_util::buttonWithAccessibilityLabelId( |
+ IDS_IOS_NAVIGATION_BAR_EDIT_BUTTON); |
+ [[EarlGrey selectElementWithMatcher:edit] performAction:grey_tap()]; |
+ |
+ [self waitForSingleBookmarkEditorToDisplay]; |
+ |
+ [self verifyNoKeyboardCommandsAreRegistered]; |
+ |
+ id<GREYMatcher> cancel = grey_accessibilityID(@"Cancel"); |
+ [[EarlGrey selectElementWithMatcher:cancel] performAction:grey_tap()]; |
+} |
+ |
+// Tests that keyboard commands are not registered when the Bookmarks UI is |
+// shown on iPhone and registered on iPad. |
+- (void)testKeyboardCommandsNotRegistered_BookmarksPresented { |
+ // Open Bookmarks |
+ [self selectToolsMenuItem:grey_accessibilityID(kToolsMenuBookmarksId)]; |
+ |
+ if (IsIPadIdiom()) { |
+ [self verifyKeyboardCommandsAreRegistered]; |
+ } else { |
+ [self verifyNoKeyboardCommandsAreRegistered]; |
+ |
+ [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Exit")] |
+ performAction:grey_tap()]; |
+ } |
+} |
+ |
+// Tests that keyboard commands are not registered when the Recent Tabs UI is |
+// shown on iPhone and registered on iPad. |
+- (void)testKeyboardCommands_RecentTabsPresented { |
+ // Open Recent Tabs |
+ id<GREYMatcher> recentTabs = grey_accessibilityID(kToolsMenuOtherDevicesId); |
+ [self selectToolsMenuItem:recentTabs]; |
+ |
+ if (IsIPadIdiom()) { |
+ [self verifyKeyboardCommandsAreRegistered]; |
+ } else { |
+ [self verifyNoKeyboardCommandsAreRegistered]; |
+ |
+ id<GREYMatcher> exit = grey_accessibilityID(@"Exit"); |
+ [[EarlGrey selectElementWithMatcher:exit] performAction:grey_tap()]; |
+ } |
+} |
+ |
+// Tests that when the app is opened on a web page and a key is pressed, the |
+// web view is the first responder. |
+- (void)testWebViewIsFirstResponderUponKeyPress { |
+ web::test::SetUpFileBasedHttpServer(); |
+ GURL URL = web::test::HttpServer::MakeUrl( |
+ "http://ios/testing/data/http_server_files/pony.html"); |
+ [ChromeEarlGrey loadURL:URL]; |
+ |
+ [self verifyKeyboardCommandsAreRegistered]; |
+ |
+ UIResponder* firstResponder = GetFirstResponder(); |
+ GREYAssert( |
+ [firstResponder isKindOfClass:NSClassFromString(@"WKContentView")], |
+ @"Expected first responder to be a WKContentView. Instead, is a %@", |
+ NSStringFromClass([firstResponder class])); |
+} |
+ |
+@end |