|  | // Copyright 2016 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #import <UIKit/UIKit.h> | 
|  | #import <WebKit/WebKit.h> | 
|  | #import <XCTest/XCTest.h> | 
|  |  | 
|  | #import "base/ios/block_types.h" | 
|  | #import "base/strings/sys_string_conversions.h" | 
|  | #import "ios/testing/earl_grey/earl_grey_test.h" | 
|  | #import "ios/testing/earl_grey/matchers.h" | 
|  | #import "ios/web/public/test/element_selector.h" | 
|  | #import "ios/web/shell/test/earl_grey/shell_actions.h" | 
|  | #import "ios/web/shell/test/earl_grey/shell_earl_grey.h" | 
|  | #import "ios/web/shell/test/earl_grey/shell_matchers.h" | 
|  | #import "ios/web/shell/test/earl_grey/web_shell_test_case.h" | 
|  | #import "net/test/embedded_test_server/embedded_test_server.h" | 
|  |  | 
|  | using testing::ButtonWithAccessibilityLabel; | 
|  | using testing::ElementToDismissAlert; | 
|  |  | 
|  | namespace { | 
|  | const char kHtmlFile[] = "/context_menu.html"; | 
|  | } | 
|  |  | 
|  | // Context menu test cases for the web shell. | 
|  | @interface ContextMenuTestCase : WebShellTestCase | 
|  |  | 
|  | @end | 
|  |  | 
|  | @implementation ContextMenuTestCase | 
|  |  | 
|  | // Tests context menu appears on a regular link. | 
|  | // TODO(crbug.com/40896396): Test is flaky. Re-enable the test. | 
|  | - (void)testContextMenu { | 
|  | const char linkID[] = "normal-link"; | 
|  | NSString* const linkText = @"normal-link-text"; | 
|  | const GURL pageURL = self.testServer->GetURL(kHtmlFile); | 
|  |  | 
|  | [ShellEarlGrey loadURL:pageURL]; | 
|  | [ShellEarlGrey waitForWebStateContainingText:linkText]; | 
|  |  | 
|  | [[EarlGrey selectElementWithMatcher:web::WebView()] | 
|  | performAction:web::LongPressElementForContextMenu( | 
|  | [ElementSelector selectorWithElementID:linkID])]; | 
|  |  | 
|  | id<GREYMatcher> copyItem = ButtonWithAccessibilityLabel(@"Copy Link"); | 
|  | id<GREYMatcher> cancelItem = ButtonWithAccessibilityLabel(@"Cancel"); | 
|  |  | 
|  | // Context menu should have a "copy link" item. | 
|  | [[EarlGrey selectElementWithMatcher:copyItem] | 
|  | assertWithMatcher:grey_notNil()]; | 
|  |  | 
|  | // Dismiss the context menu. | 
|  | [[EarlGrey selectElementWithMatcher:cancelItem] performAction:grey_tap()]; | 
|  |  | 
|  | // Wait for the context menu to be dismissed and check if it was. | 
|  | [ShellEarlGrey waitForUIElementToDisappearWithMatcher:copyItem]; | 
|  | } | 
|  |  | 
|  | // Tests context menu on element that has WebkitTouchCallout set to none from an | 
|  | // ancestor and overridden. | 
|  | // TODO(crbug.com/40896396): Test is flaky. Re-enable the test. | 
|  | - (void)testContextMenuWebkitTouchCalloutOverride { | 
|  | const char linkID[] = "no-webkit-link"; | 
|  | NSString* const linkText = @"no-webkit-link-text"; | 
|  | const GURL pageURL = self.testServer->GetURL(kHtmlFile); | 
|  |  | 
|  | [ShellEarlGrey loadURL:pageURL]; | 
|  | [ShellEarlGrey waitForWebStateContainingText:linkText]; | 
|  |  | 
|  | [[EarlGrey selectElementWithMatcher:web::WebView()] | 
|  | performAction:web::LongPressElementForContextMenu( | 
|  | [ElementSelector selectorWithElementID:linkID])]; | 
|  |  | 
|  | id<GREYMatcher> copyItem = ButtonWithAccessibilityLabel(@"Copy Link"); | 
|  | id<GREYMatcher> cancelItem = ButtonWithAccessibilityLabel(@"Cancel"); | 
|  |  | 
|  | // Context menu should have a "copy link" item. | 
|  | [[EarlGrey selectElementWithMatcher:copyItem] | 
|  | assertWithMatcher:grey_notNil()]; | 
|  |  | 
|  | // Dismiss the context menu. | 
|  | [[EarlGrey selectElementWithMatcher:cancelItem] performAction:grey_tap()]; | 
|  |  | 
|  | // Wait for the context menu to be dismissed and check if it was. | 
|  | [ShellEarlGrey waitForUIElementToDisappearWithMatcher:copyItem]; | 
|  | } | 
|  |  | 
|  | @end |