chromium/ios/chrome/test/earl_grey/chrome_xcui_actions.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_TEST_EARL_GREY_CHROME_XCUI_ACTIONS_H_
#define IOS_CHROME_TEST_EARL_GREY_CHROME_XCUI_ACTIONS_H_

#import <Foundation/Foundation.h>

#import "ios/testing/earl_grey/earl_grey_test.h"

namespace chrome_test_util {

// Action (XCUI, hence local) to long press a cell item with
// `accessibility_identifier` in `window_number` and drag it to the given `edge`
// of the app screen (can trigger a new window) before dropping it. Returns YES
// on success (finding the item).
BOOL LongPressCellAndDragToEdge(NSString* accessibility_identifier,
                                GREYContentEdge edge,
                                int window_number);

// Action (XCUI, hence local) to long press a cell item  with
// `src_accessibility_identifier` in `src_window_number` and drag it to the
// given normalized offset of the cell or window with
// `dst_accessibility_identifier` in `dst_window_number` before dropping it. To
// target a window, pass nil as `dst_accessibility_identifier`. Returns YES on
// success (finding both items).
BOOL LongPressCellAndDragToOffsetOf(NSString* src_accessibility_identifier,
                                    int src_window_number,
                                    NSString* dst_accessibility_identifier,
                                    int dst_window_number,
                                    CGVector dst_normalized_offset);

// Action (XCUI, hence local) to long press a link element in a webview with
// `src_accessibility_identifier` in `src_window_number` and drag it to the
// given normalized offset of the view with  `dst_accessibility_identifier` in
// `dst_window_number` before dropping it. To target a window, pass nil as
// `dst_accessibility_identifier`. Returns YES on success (finding both items).
BOOL LongPressLinkAndDragToView(NSString* src_accessibility_identifier,
                                int src_window_number,
                                NSString* dst_accessibility_identifier,
                                int dst_window_number,
                                CGVector dst_normalized_offset);

// Convenience helper for the above function, using the default window for both
// elements, and an offset of (0.5, 0.5).
BOOL LongPressLinkAndDragToView(NSString* src_accessibility_identifier,
                                NSString* dst_accessibility_identifier);

// Action (XCUI, hence local) to resize split windows by dragging the splitter.
// This action requires two windows (`first_window_number` and
// `second_window_number`, in any order) to find where the splitter is located.
// A given `first_window_normalized_screen_size` defines the normalized size
// [0.0 - 1.0] wanted for the `first_window_number`. Returns NO if any window
// is not found or if one of them is a floating window.
// Notes: The size requested
// will be matched by the OS to the closest available multiwindow layout. This
// function works with any device oreintation and with either LTR or RTL
// languages. Example of use:
//   [ChromeEarlGrey openNewWindow];
//   [ChromeEarlGrey waitForForegroundWindowCount:2];
//   chrome_test_util::DragWindowSplitterToSize(0, 1, 0.25);
// Starting with window sizes 438 and 320 pts, this will resize
// them to 320pts and 438 pts respectively.
BOOL DragWindowSplitterToSize(int first_window_number,
                              int second_window_number,
                              CGFloat first_window_normalized_screen_size);

// Action (XCUI, hence local) to tap item with `accessibility_identifier` in
// `window_number`. Should only be used in second or third window, until a
// (already requested) fix is made to EarlGrey to allow using grey_tap()
// correctly on extra windows (right now it fails visibility check).
BOOL TapAtOffsetOf(NSString* accessibility_identifier,
                   int window_number,
                   CGVector normalized_offset);

// Action (XCUI, hence local) to type text in text field with
// `accessibility_identifier` in `window_number`. Use to replace grey_typeText
// call that are flaky. grey_typeText fails sometime during a layout change of
// the keyboard.
BOOL TypeText(NSString* accessibility_identifier,
              int window_number,
              NSString* text);

}  // namespace chrome_test_util

#endif  // IOS_CHROME_TEST_EARL_GREY_CHROME_XCUI_ACTIONS_H_