ui: Add multi-step EventGenerator::MoveMouseBy/MoveTouch*
Add multi-step EventGenerator::MoveMouseBy/MoveTouch* that generates multiple events to get to target location. Multi-step `MoveMouseBy` will be used by a test in a follow-up CL. Update callers to bind lamda instead of directly binding `MoveMouseBy` since it is ambiguous now. Bug: None Change-Id: I808d572541dd5777cc2db1631969098b62613829 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6442199 Reviewed-by: Mitsuru Oshima <oshima@chromium.org> Commit-Queue: Xiyuan Xia <xiyuan@chromium.org> Cr-Commit-Position: refs/heads/main@{#1444863}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
8a957f7a45
commit
363ff8348a
ash
ui/events/test
@@ -1312,16 +1312,16 @@ TEST_F(DragDropControllerTest, EventTarget) {
|
|||||||
generator.PressLeftButton();
|
generator.PressLeftButton();
|
||||||
// For drag enter
|
// For drag enter
|
||||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(&ui::test::EventGenerator::MoveMouseBy,
|
FROM_HERE,
|
||||||
base::Unretained(&generator), 0, 1));
|
base::BindLambdaForTesting([&]() { generator.MoveMouseBy(0, 1); }));
|
||||||
// For drag update
|
// For drag update
|
||||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(&ui::test::EventGenerator::MoveMouseBy,
|
FROM_HERE,
|
||||||
base::Unretained(&generator), 0, 1));
|
base::BindLambdaForTesting([&]() { generator.MoveMouseBy(0, 1); }));
|
||||||
// For perform drop
|
// For perform drop
|
||||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(&ui::test::EventGenerator::ReleaseLeftButton,
|
FROM_HERE,
|
||||||
base::Unretained(&generator)));
|
base::BindLambdaForTesting([&]() { generator.ReleaseLeftButton(); }));
|
||||||
|
|
||||||
drag_drop_controller_->set_should_block_during_drag_drop(true);
|
drag_drop_controller_->set_should_block_during_drag_drop(true);
|
||||||
auto data = CreateDragData(/*with_image=*/false);
|
auto data = CreateDragData(/*with_image=*/false);
|
||||||
@@ -1352,12 +1352,12 @@ TEST_F(DragDropControllerTest, DragTabChangesDragOperationToMove) {
|
|||||||
generator.PressLeftButton();
|
generator.PressLeftButton();
|
||||||
// For drag enter.
|
// For drag enter.
|
||||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(&ui::test::EventGenerator::MoveMouseBy,
|
FROM_HERE,
|
||||||
base::Unretained(&generator), 0, 1));
|
base::BindLambdaForTesting([&]() { generator.MoveMouseBy(0, 1); }));
|
||||||
// For perform drop.
|
// For perform drop.
|
||||||
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
|
||||||
FROM_HERE, base::BindOnce(&ui::test::EventGenerator::ReleaseLeftButton,
|
FROM_HERE,
|
||||||
base::Unretained(&generator)));
|
base::BindLambdaForTesting([&]() { generator.ReleaseLeftButton(); }));
|
||||||
|
|
||||||
drag_drop_controller_->set_should_block_during_drag_drop(true);
|
drag_drop_controller_->set_should_block_during_drag_drop(true);
|
||||||
DragOperation operation = drag_drop_controller_->StartDragAndDrop(
|
DragOperation operation = drag_drop_controller_->StartDragAndDrop(
|
||||||
|
@@ -81,6 +81,7 @@
|
|||||||
#include "base/i18n/rtl.h"
|
#include "base/i18n/rtl.h"
|
||||||
#include "base/memory/raw_ptr.h"
|
#include "base/memory/raw_ptr.h"
|
||||||
#include "base/run_loop.h"
|
#include "base/run_loop.h"
|
||||||
|
#include "base/test/bind.h"
|
||||||
#include "base/test/icu_test_util.h"
|
#include "base/test/icu_test_util.h"
|
||||||
#include "base/test/metrics/histogram_tester.h"
|
#include "base/test/metrics/histogram_tester.h"
|
||||||
#include "base/test/metrics/user_action_tester.h"
|
#include "base/test/metrics/user_action_tester.h"
|
||||||
@@ -2966,14 +2967,10 @@ class ShelfLayoutManagerDragDropTest
|
|||||||
|
|
||||||
// Drags a view vertically by `dy` pixels. Assumes the drag has been started.
|
// Drags a view vertically by `dy` pixels. Assumes the drag has been started.
|
||||||
void MoveDragBy(int dy) {
|
void MoveDragBy(int dy) {
|
||||||
auto move_fn =
|
if (GetParam() == DragEventType::kMouse) {
|
||||||
base::BindRepeating(GetParam() == DragEventType::kMouse
|
generator_->MoveMouseBy(0, dy, /*count=*/abs(dy));
|
||||||
? &ui::test::EventGenerator::MoveMouseBy
|
} else {
|
||||||
: &ui::test::EventGenerator::MoveTouchBy,
|
generator_->MoveTouchBy(0, dy, /*count=*/abs(dy));
|
||||||
base::Unretained(generator_));
|
|
||||||
const int step = dy / abs(dy);
|
|
||||||
for (int i = 0; i < abs(dy); ++i) {
|
|
||||||
move_fn.Run(0, step);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -341,19 +341,42 @@ void EventGenerator::PressTouchId(
|
|||||||
Dispatch(&touchev);
|
Dispatch(&touchev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventGenerator::MoveTouch(const gfx::Point& point) {
|
void EventGenerator::MoveTouch(const gfx::Point& point, int count) {
|
||||||
MoveTouchId(point, 0);
|
MoveTouchId(point, 0, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventGenerator::MoveTouchId(const gfx::Point& point, int touch_id) {
|
void EventGenerator::MoveTouchId(const gfx::Point& point,
|
||||||
SetCurrentScreenLocation(point);
|
int touch_id,
|
||||||
ui::TouchEvent touchev = CreateTestTouchEvent(
|
int count) {
|
||||||
ui::EventType::kTouchMoved, GetLocationInCurrentRoot(), touch_id, flags_,
|
// Tracks the location of last `SetCurrentScreenLocation` in the loop.
|
||||||
ui::EventTimeForNow());
|
gfx::Point expected_current_location = current_screen_location_;
|
||||||
Dispatch(&touchev);
|
|
||||||
|
|
||||||
if (!grab_)
|
const gfx::Point start_point = current_screen_location_;
|
||||||
UpdateCurrentDispatcher(point);
|
const gfx::Vector2dF diff(point - start_point);
|
||||||
|
for (float i = 1; i <= count; i++) {
|
||||||
|
gfx::Vector2dF step(diff);
|
||||||
|
step.Scale(i / count);
|
||||||
|
gfx::Point move_point = start_point + gfx::ToRoundedVector2d(step);
|
||||||
|
if (!grab_) {
|
||||||
|
UpdateCurrentDispatcher(move_point);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changing `current_screen_location_` in nested `MoveTouchId` under
|
||||||
|
// `Dispatch` is not supported.
|
||||||
|
CHECK_EQ(expected_current_location, current_screen_location_);
|
||||||
|
|
||||||
|
// Update current location before dispatching because some tests (e.g.
|
||||||
|
// apps grid view dragging related) calculate the next touch position
|
||||||
|
// during the dispatch.
|
||||||
|
SetCurrentScreenLocation(move_point);
|
||||||
|
expected_current_location = move_point;
|
||||||
|
|
||||||
|
delegate()->ConvertPointToTarget(current_target_, &move_point);
|
||||||
|
ui::TouchEvent touchev =
|
||||||
|
CreateTestTouchEvent(ui::EventType::kTouchMoved, move_point, touch_id,
|
||||||
|
flags_, ui::EventTimeForNow());
|
||||||
|
Dispatch(&touchev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventGenerator::ReleaseTouch() {
|
void EventGenerator::ReleaseTouch() {
|
||||||
|
@@ -257,8 +257,9 @@ class EventGenerator {
|
|||||||
MoveMouseRelativeTo(window, gfx::Point(x, y));
|
MoveMouseRelativeTo(window, gfx::Point(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveMouseBy(int x, int y) {
|
void MoveMouseBy(int x, int y) { MoveMouseBy(x, y, /*count=*/1); }
|
||||||
MoveMouseTo(current_screen_location_ + gfx::Vector2d(x, y));
|
void MoveMouseBy(int x, int y, int count) {
|
||||||
|
MoveMouseTo(current_screen_location_ + gfx::Vector2d(x, y), count);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generates events to drag mouse to given |point|.
|
// Generates events to drag mouse to given |point|.
|
||||||
@@ -312,22 +313,31 @@ class EventGenerator {
|
|||||||
int touch_id,
|
int touch_id,
|
||||||
const std::optional<gfx::Point>& touch_location_in_screen = std::nullopt);
|
const std::optional<gfx::Point>& touch_location_in_screen = std::nullopt);
|
||||||
|
|
||||||
// Generates a EventType::kTouchMoved event to |point|.
|
// Generates EventType::kTouchMoved events to |point|.
|
||||||
void MoveTouch(const gfx::Point& point);
|
void MoveTouch(const gfx::Point& point, int count);
|
||||||
|
void MoveTouch(const gfx::Point& point) { MoveTouch(point, /*count=*/1); }
|
||||||
|
|
||||||
// Generates a EventType::kTouchMoved event moving by (x, y) from current
|
// Generates EventType::kTouchMoved events moving by (x, y) from current
|
||||||
// location.
|
// location.
|
||||||
void MoveTouchBy(int x, int y) {
|
void MoveTouchBy(int x, int y, int count) {
|
||||||
MoveTouch(current_screen_location_ + gfx::Vector2d(x, y));
|
MoveTouch(current_screen_location_ + gfx::Vector2d(x, y), count);
|
||||||
}
|
}
|
||||||
|
void MoveTouchBy(int x, int y) { MoveTouchBy(x, y, /*count=*/1); }
|
||||||
|
|
||||||
// Generates a EventType::kTouchMoved event to |point| with |touch_id|.
|
// Generates EventType::kTouchMoved events to |point| with |touch_id|.
|
||||||
void MoveTouchId(const gfx::Point& point, int touch_id);
|
void MoveTouchId(const gfx::Point& point, int touch_id, int count);
|
||||||
|
void MoveTouchId(const gfx::Point& point, int touch_id) {
|
||||||
|
MoveTouchId(point, touch_id, /*count=*/1);
|
||||||
|
}
|
||||||
|
|
||||||
// Generates a EventType::kTouchMoved event moving (x, y) from current
|
// Generates a EventType::kTouchMoved event moving (x, y) from current
|
||||||
// location with |touch_id|.
|
// location with |touch_id|.
|
||||||
|
void MoveTouchIdBy(int touch_id, int x, int y, int count) {
|
||||||
|
MoveTouchId(current_screen_location_ + gfx::Vector2d(x, y), touch_id,
|
||||||
|
count);
|
||||||
|
}
|
||||||
void MoveTouchIdBy(int touch_id, int x, int y) {
|
void MoveTouchIdBy(int touch_id, int x, int y) {
|
||||||
MoveTouchId(current_screen_location_ + gfx::Vector2d(x, y), touch_id);
|
MoveTouchIdBy(touch_id, x, y, /*count=*/1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generates a touch release event.
|
// Generates a touch release event.
|
||||||
|
Reference in New Issue
Block a user