Commit 5841d65a authored by Yuichiro Hanada's avatar Yuichiro Hanada Committed by Commit Bot

Send a release event for sticky key when scroll direction is changed.

The unexpected behavior change was introduced in crrev.com/2731283004.
After the change, reversing scroll direction disables the sticky key,
but doesn't send a key release event for it.

Bug: 1049492
Test: unit_tests
Change-Id: I2c57e70e7ecb9cf8d12c17cea9d38d45ff00db05
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2041211Reviewed-by: default avatarDavid Tseng <dtseng@chromium.org>
Reviewed-by: default avatarKevin Schoedel <kpschoedel@chromium.org>
Commit-Queue: Yuichiro Hanada <yhanada@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739200}
parent ba327e31
......@@ -32,13 +32,20 @@ ui::EventRewriteStatus RewriteUpdate(
std::unique_ptr<ui::Event>* rewritten_event) {
if (consumed)
return ui::EVENT_REWRITE_DISCARD;
const bool flags_rewritten = mod_down_flags & ~event.flags();
// If the flag is not changed and no need to send a release key event.
if (!released && !flags_rewritten)
return ui::EVENT_REWRITE_CONTINUE;
*rewritten_event = ui::Event::Clone(event);
if (mod_down_flags & ~event.flags()) {
*rewritten_event = ui::Event::Clone(event);
(*rewritten_event)->set_flags(event.flags() | mod_down_flags);
return released ? ui::EVENT_REWRITE_DISPATCH_ANOTHER
: ui::EVENT_REWRITE_REWRITTEN;
}
return ui::EVENT_REWRITE_CONTINUE;
if (released)
return ui::EVENT_REWRITE_DISPATCH_ANOTHER;
return ui::EVENT_REWRITE_REWRITTEN;
}
} // namespace
......
......@@ -3365,6 +3365,61 @@ TEST_F(EventRewriterAshTest, KeyEventRewritingEdgeCases) {
static_cast<ui::KeyEvent*>(events[0].get())->key_code());
}
TEST_F(EventRewriterAshTest, ScrollEventDispatchImpl) {
std::vector<std::unique_ptr<ui::Event>> events;
// Test scroll event is correctly modified.
SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
ui::DomKey::CONTROL);
PopEvents(&events);
gfx::PointF location(0, 0);
ui::ScrollEvent scroll(ui::ET_SCROLL, location, location,
ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
1 /* y_offset */, 0 /* x_offset_ordinal */,
1 /* y_offset_ordinal */, 2 /* finger */);
ui::EventDispatchDetails details = Send(&scroll);
ASSERT_FALSE(details.dispatcher_destroyed);
PopEvents(&events);
EXPECT_EQ(1u, events.size());
EXPECT_TRUE(events[0]->IsScrollEvent());
EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
// Test FLING_START event deactivates the sticky key, but is modified.
ui::ScrollEvent fling_start(
ui::ET_SCROLL_FLING_START, location, location, ui::EventTimeForNow(),
0 /* flag */, 0 /* x_offset */, 0 /* y_offset */,
0 /* x_offset_ordinal */, 0 /* y_offset_ordinal */, 2 /* finger */);
details = Send(&fling_start);
PopEvents(&events);
EXPECT_EQ(2u, events.size());
EXPECT_TRUE(events[0]->IsScrollEvent());
EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
EXPECT_EQ(ui::VKEY_CONTROL,
static_cast<ui::KeyEvent*>(events[1].get())->key_code());
// Test scroll direction change causes that modifier release event is sent.
SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
ui::DomKey::CONTROL);
details = Send(&scroll);
ASSERT_FALSE(details.dispatcher_destroyed);
PopEvents(&events);
ui::ScrollEvent scroll2(ui::ET_SCROLL, location, location,
ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
-1 /* y_offset */, 0 /* x_offset_ordinal */,
-1 /* y_offset_ordinal */, 2 /* finger */);
details = Send(&scroll2);
ASSERT_FALSE(details.dispatcher_destroyed);
PopEvents(&events);
EXPECT_EQ(2u, events.size());
EXPECT_TRUE(events[0]->IsScrollEvent());
EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
EXPECT_EQ(ui::VKEY_CONTROL,
static_cast<ui::KeyEvent*>(events[1].get())->key_code());
}
class StickyKeysOverlayTest : public EventRewriterAshTest {
public:
StickyKeysOverlayTest() : overlay_(NULL) {}
......
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