// 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.
#ifndef IOS_WEB_PUBLIC_TEST_WEB_VIEW_INTERACTION_TEST_UTIL_H_
#define IOS_WEB_PUBLIC_TEST_WEB_VIEW_INTERACTION_TEST_UTIL_H_
#import <UIKit/UIKit.h>
#include <memory>
#include <string>
#import "base/ios/block_types.h"
#include "base/values.h"
#include "ios/web/public/test/element_selector.h"
namespace web {
class JavaScriptFeature;
class WebState;
namespace test {
// Synchronously returns the result of executed JavaScript, returning nullptr
// if the JavaScript does not complete.
std::unique_ptr<base::Value> ExecuteJavaScript(web::WebState* web_state,
const std::string& script);
// Synchronously returns the result of the executed JavaScript function by
// calling `function` with `parameters` in web_state's main frame.
std::unique_ptr<base::Value> CallJavaScriptFunction(
web::WebState* web_state,
const std::string& function,
const base::Value::List& parameters);
// Synchronously returns the result of the executed JavaScript function by
// calling `function` with `parameters` in web_state's main frame in the
// content world associated with `feature`. If `feature` is null, the function
// will be executed in the page content world.
std::unique_ptr<base::Value> CallJavaScriptFunctionForFeature(
web::WebState* web_state,
const std::string& function,
const base::Value::List& parameters,
JavaScriptFeature* feature);
// Returns the CGRect, in the coordinate system of web_state's view, that
// encloses the element returned by `selector` in `web_state`'s webview.
// There is no guarantee that the CGRect returned is inside the current window;
// callers should check and act accordingly (scrolling the webview, perhaps).
// Returns CGRectNull if no element could be found.
CGRect GetBoundingRectOfElement(web::WebState* web_state,
ElementSelector* selector);
// Returns whether the element with `element_id` in the passed `web_state` has
// been tapped using a JavaScript click() event.
bool TapWebViewElementWithId(web::WebState* web_state,
const std::string& element_id);
// Returns whether the element with `element_id` in the passed `web_state` has
// been tapped using a JavaScript click() event. `error` can be nil.
bool TapWebViewElementWithId(web::WebState* web_state,
const std::string& element_id,
NSError* __autoreleasing* error);
// Looks for an element with `element_id` within window.frames[0] in the passed
// `web_state`. Returns whether this element has been tapped using a JavaScript
// click() event. This only works on same-origin iframes.
bool TapWebViewElementWithIdInIframe(web::WebState* web_state,
const std::string& element_id);
// Returns whether the element with `element_id` in the passed `web_state` has
// been focused using a JavaScript focus() event.
bool FocusWebViewElementWithId(web::WebState* web_state,
const std::string& element_id);
// Returns whether the form with `form_id` in the passed `web_state` has been
// submitted using a JavaScript submit() event.
bool SubmitWebViewFormWithId(web::WebState* web_state,
const std::string& form_id);
// Returns whether the <option id="`element_id`"> in the passed `web_state` has
// been selected using a JavaScript "selected=true" operation.
bool SelectWebViewElementWithId(web::WebState* web_state,
const std::string& element_id);
} // namespace test
} // namespace web
#endif // IOS_WEB_PUBLIC_TEST_WEB_VIEW_INTERACTION_TEST_UTIL_H_