#ifndef CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
#define CHROME_TEST_BASE_INTERACTIVE_TEST_UTILS_H_
#include <utility>
#include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
#include "build/build_config.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/view_ids.h"
#include "ui/base/test/ui_controls.h"
#include "ui/display/display.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/widget/widget_observer.h"
class BrowserWindowInterface;
namespace display {
class Screen;
}
#if defined(TOOLKIT_VIEWS)
namespace views {
class View;
class Widget;
}
#endif
namespace ui_test_utils {
class BrowserActivationWaiter : public views::WidgetObserver {
public:
explicit BrowserActivationWaiter(const BrowserWindowInterface* browser);
BrowserActivationWaiter(const BrowserActivationWaiter&) = delete;
BrowserActivationWaiter& operator=(const BrowserActivationWaiter&) = delete;
~BrowserActivationWaiter() override;
void WaitForActivation();
void OnWidgetActivationChanged(views::Widget* widget, bool active) override;
private:
bool observed_ = false;
base::RunLoop run_loop_;
};
class BrowserDeactivationWaiter : public BrowserListObserver {
public:
explicit BrowserDeactivationWaiter(const Browser* browser);
BrowserDeactivationWaiter(const BrowserDeactivationWaiter&) = delete;
BrowserDeactivationWaiter& operator=(const BrowserDeactivationWaiter&) =
delete;
~BrowserDeactivationWaiter() override;
void WaitForDeactivation();
private:
void OnBrowserNoLongerActive(Browser* browser) override;
const base::WeakPtr<const Browser> browser_;
bool observed_ = false;
base::RunLoop run_loop_;
};
[[nodiscard]] bool BringBrowserWindowToFront(
const BrowserWindowInterface* browser);
bool IsViewFocused(const Browser* browser, ViewID vid);
void ClickOnView(views::View* view);
void ClickOnView(const Browser* browser, ViewID vid);
void FocusView(const Browser* browser, ViewID vid);
void HideNativeWindow(gfx::NativeWindow window);
[[nodiscard]] bool ShowAndFocusNativeWindow(gfx::NativeWindow window);
[[nodiscard]] bool SendKeyPressSync(
const BrowserWindowInterface* browser,
ui::KeyboardCode key,
bool control,
bool shift,
bool alt,
bool command,
ui_controls::KeyEventType wait_for = ui_controls::kKeyRelease);
[[nodiscard]] bool SendKeyPressToWindowSync(
const gfx::NativeWindow window,
ui::KeyboardCode key,
bool control,
bool shift,
bool alt,
bool command,
ui_controls::KeyEventType wait_for = ui_controls::kKeyRelease);
[[nodiscard]] bool SendMouseMoveSync(
const gfx::Point& location,
gfx::NativeWindow window_hint = gfx::NativeWindow());
[[nodiscard]] bool SendMouseEventsSync(
ui_controls::MouseButton type,
int button_state,
gfx::NativeWindow window_hint = gfx::NativeWindow());
#if defined(TOOLKIT_VIEWS)
void MoveMouseToCenterAndClick(
views::View* view,
ui_controls::MouseButton button,
int button_state,
base::OnceClosure task,
int accelerator_state = ui_controls::kNoAccelerator);
void MoveMouseToCenterWithOffsetAndClick(
views::View* view,
const gfx::Vector2d& offset,
ui_controls::MouseButton button,
int button_state,
base::OnceClosure task,
int accelerator_state = ui_controls::kNoAccelerator);
gfx::Point GetCenterInScreenCoordinates(const views::View* view);
void WaitForViewFocus(Browser* browser, ViewID vid, bool focused);
void WaitForViewFocus(Browser* browser, views::View* view, bool focused);
#endif
#if BUILDFLAG(IS_MAC)
bool ClearKeyEventModifiers();
void HandleMissingKeyWindow();
#endif
namespace internal {
void ClickTask(ui_controls::MouseButton button,
int button_state,
base::OnceClosure followup,
int accelerator_state = ui_controls::kNoAccelerator);
}
display::Display GetSecondaryDisplay(display::Screen* screen);
std::pair<display::Display, display::Display> GetDisplays(
display::Screen* screen);
}
#endif