Commit b4349b2d authored by Lan Wei's avatar Lan Wei Committed by Commit Bot

Reland "Support triple click in Chromedriver PerformActions"

When we are using PerformActions from ChromeDriver to simulate three
mouse click, it only set the click count to 2, not 3, so this test fails
third_party/blink/web_tests/external/wpt/webdriver/tests/perform_actions
/pointer_tripleclick.py.

PerformActions should keep the mouse click count and decide if we should
increase the count or set to 1 when we have a mouse press based on the
interval of two mouse presses and difference between the current mouse
positions and the last one.

We should keep the click count in the session, and calculate the new
click count based on the count stored in the session.

Bug: 1119679
Change-Id: Iadac8e0f7dd13aebad6dc06c48c572426709a065
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2368335Reviewed-by: default avatarJohn Chen <johnchen@chromium.org>
Reviewed-by: default avatarLan Wei <lanwei@chromium.org>
Commit-Queue: Lan Wei <lanwei@chromium.org>
Cr-Commit-Position: refs/heads/master@{#801082}
parent 82c139d3
...@@ -417,30 +417,30 @@ Status ElementInViewCenter(Session* session, ...@@ -417,30 +417,30 @@ Status ElementInViewCenter(Session* session,
return Status(kOk); return Status(kOk);
} }
bool IsRepeatedClickEvent(float x, int GetMouseClickCount(float x,
float y, float y,
float last_x, float last_x,
float last_y, float last_y,
int click_count, int click_count,
const base::TimeTicks& timestamp, const base::TimeTicks& timestamp,
const base::TimeTicks& last_mouse_click_time) { const base::TimeTicks& last_mouse_click_time) {
const int kDoubleClickTimeMS = 500; const int kDoubleClickTimeMS = 500;
const int kDoubleClickRange = 4; const int kDoubleClickRange = 4;
if (click_count == 0) if (click_count == 0)
return false; return 1;
base::TimeDelta time_difference = timestamp - last_mouse_click_time; base::TimeDelta time_difference = timestamp - last_mouse_click_time;
if (time_difference.InMilliseconds() > kDoubleClickTimeMS) if (time_difference.InMilliseconds() > kDoubleClickTimeMS)
return false; return 1;
if (std::abs(x - last_x) > kDoubleClickRange / 2) if (std::abs(x - last_x) > kDoubleClickRange / 2)
return false; return 1;
if (std::abs(y - last_y) > kDoubleClickRange / 2) if (std::abs(y - last_y) > kDoubleClickRange / 2)
return false; return 1;
return true; return click_count + 1;
} }
const char kLandscape[] = "landscape"; const char kLandscape[] = "landscape";
...@@ -1688,6 +1688,7 @@ Status ExecutePerformActions(Session* session, ...@@ -1688,6 +1688,7 @@ Status ExecutePerformActions(Session* session,
} else if (buttons[id] == 0) { } else if (buttons[id] == 0) {
button_type[id].clear(); button_type[id].clear();
} }
MouseEvent event(StringToMouseEventType(action_type), MouseEvent event(StringToMouseEventType(action_type),
StringToMouseButton(button_type[id]), StringToMouseButton(button_type[id]),
action_locations[id].x(), action_locations[id].x(),
...@@ -1697,11 +1698,10 @@ Status ExecutePerformActions(Session* session, ...@@ -1697,11 +1698,10 @@ Status ExecutePerformActions(Session* session,
event.modifiers = session->sticky_modifiers; event.modifiers = session->sticky_modifiers;
if (event.type == kPressedMouseEventType) { if (event.type == kPressedMouseEventType) {
base::TimeTicks timestamp = base::TimeTicks::Now(); base::TimeTicks timestamp = base::TimeTicks::Now();
bool is_repeated_click = IsRepeatedClickEvent( event.click_count = GetMouseClickCount(
event.x, event.y, session->mouse_position.x, event.x, event.y, session->mouse_position.x,
session->mouse_position.y, session->click_count, session->mouse_position.y, session->click_count,
timestamp, session->mouse_click_timestamp); timestamp, session->mouse_click_timestamp);
event.click_count = is_repeated_click ? 2 : 1;
buttons[id] |= StringToModifierMouseButton(button_type[id]); buttons[id] |= StringToModifierMouseButton(button_type[id]);
session->mouse_position = WebPoint(event.x, event.y); session->mouse_position = WebPoint(event.x, event.y);
session->click_count = event.click_count; session->click_count = event.click_count;
......
...@@ -4,7 +4,7 @@ from tests.support.inline import inline ...@@ -4,7 +4,7 @@ from tests.support.inline import inline
lots_of_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor "\ lots_of_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor "\
"incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud "\ "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud "\
" exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
def test_tripleclick_at_coordinates(session, mouse_chain): def test_tripleclick_at_coordinates(session, mouse_chain):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment