#include "base/test/test_future.h"
#include "chrome/browser/actor/actor_test_util.h"
#include "chrome/browser/actor/tools/tool_request.h"
#include "chrome/browser/actor/tools/tools_test_util.h"
#include "chrome/common/actor.mojom.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "ui/gfx/geometry/point_conversions.h"
using base::test::TestFuture;
using content::EvalJs;
using content::ExecJs;
using content::GetDOMNodeId;
namespace actor {
namespace {
class ActorMouseMoveToolBrowserTest : public ActorToolsTest {
public:
ActorMouseMoveToolBrowserTest() = default;
~ActorMouseMoveToolBrowserTest() override = default;
void SetUpOnMainThread() override {
ActorToolsTest::SetUpOnMainThread();
ASSERT_TRUE(embedded_test_server()->Start());
ASSERT_TRUE(embedded_https_test_server().Start());
}
};
IN_PROC_BROWSER_TEST_F(ActorMouseMoveToolBrowserTest,
MouseMoveTool_NonExistentNode) {
const GURL url = embedded_test_server()->GetURL("/actor/mouse_log.html");
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
ASSERT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*main_frame(), kNonExistentContentNodeId);
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectErrorResult(result, mojom::ActionResultCode::kInvalidDomNodeId);
}
IN_PROC_BROWSER_TEST_F(ActorMouseMoveToolBrowserTest, MouseMoveTool_Events) {
const GURL url = embedded_test_server()->GetURL("/actor/mouse_log.html");
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
ASSERT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
{
std::optional<int> first_id = GetDOMNodeId(*main_frame(), "#first");
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*main_frame(), first_id.value());
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectOkResult(result);
}
EXPECT_EQ("mouseenter[DIV#first],mousemove[DIV#first]",
EvalJs(web_contents(), "event_log.join(',')"));
ASSERT_TRUE(ExecJs(web_contents(), "event_log = []"));
{
std::optional<int> second_id = GetDOMNodeId(*main_frame(), "#second");
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*main_frame(), second_id.value());
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectOkResult(result);
}
EXPECT_EQ(
"mouseleave[DIV#first],mouseenter[DIV#second],mousemove[DIV#second]",
EvalJs(web_contents(), "event_log.join(',')"));
}
IN_PROC_BROWSER_TEST_F(ActorMouseMoveToolBrowserTest,
MouseMoveTool_TargetOutsideViewport) {
const GURL url = embedded_test_server()->GetURL("/actor/mouse_log.html");
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
ASSERT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
ASSERT_EQ(0, EvalJs(web_contents(), "window.scrollY"));
{
std::optional<int> offscreen_id = GetDOMNodeId(*main_frame(), "#offscreen");
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*main_frame(), offscreen_id.value());
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectOkResult(result);
}
EXPECT_GT(EvalJs(web_contents(), "window.scrollY"), 0);
EXPECT_EQ("mouseenter[DIV#offscreen],mousemove[DIV#offscreen]",
EvalJs(web_contents(), "event_log.join(',')"));
}
IN_PROC_BROWSER_TEST_F(ActorMouseMoveToolBrowserTest,
MouseMoveTool_MoveToCoordinate) {
const GURL url = embedded_test_server()->GetURL("/actor/mouse_log.html");
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
ASSERT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
gfx::Point move_point = gfx::ToFlooredPoint(
GetCenterCoordinatesOfElementWithId(web_contents(), "first"));
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*active_tab(), move_point);
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectOkResult(result);
EXPECT_EQ("mouseenter[DIV#first],mousemove[DIV#first]",
EvalJs(web_contents(), "event_log.join(',')"));
}
IN_PROC_BROWSER_TEST_F(ActorMouseMoveToolBrowserTest,
MouseMoveTool_MoveToCoordinateOffScreen) {
const GURL url = embedded_test_server()->GetURL("/actor/mouse_log.html");
ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
ASSERT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
{
gfx::Point move_point = gfx::ToFlooredPoint(
GetCenterCoordinatesOfElementWithId(web_contents(), "offscreen"));
std::unique_ptr<ToolRequest> action =
MakeMouseMoveRequest(*active_tab(), move_point);
ActResultFuture result;
actor_task().Act(ToRequestList(action), result.GetCallback());
ExpectErrorResult(result, mojom::ActionResultCode::kCoordinatesOutOfBounds);
}
EXPECT_EQ("", EvalJs(web_contents(), "event_log.join(',')"));
}
}
}