Commit dc7460cd authored by Xida Chen's avatar Xida Chen Committed by Commit Bot

Ensure white listed touch action has value at touch sequence start

At touch sequence start, the white listed touch action may not have value
under certain corner cases, which is similar to the case when a touch
start is ack from the main thread (that the main thread touch action
may not have value). In this case, we explicitly set the white listed
touch action to Auto.

Unit tests are added to ensure correctness.

Bug: 904648
Change-Id: I9140f1f0625ab9b4f8c30765cd10324605b8db40
Reviewed-on: https://chromium-review.googlesource.com/c/1454089
Commit-Queue: Xida Chen <xidachen@chromium.org>
Reviewed-by: default avatarNavid Zolghadr <nzolghadr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#630015}
parent ec1c552a
...@@ -382,11 +382,14 @@ void InputRouterImpl::OnTouchEventAck(const TouchEventWithLatencyInfo& event, ...@@ -382,11 +382,14 @@ void InputRouterImpl::OnTouchEventAck(const TouchEventWithLatencyInfo& event,
touch_action_filter_.AppendToGestureSequenceForDebugging( touch_action_filter_.AppendToGestureSequenceForDebugging(
base::NumberToString(event.event.unique_touch_event_id).c_str()); base::NumberToString(event.event.unique_touch_event_id).c_str());
touch_action_filter_.IncreaseActiveTouches(); touch_action_filter_.IncreaseActiveTouches();
// In certain corner cases, the ack for the touch start may not come with a
// touch action, then we should set the touch actions to Auto.
if ((compositor_touch_action_enabled_ && if ((compositor_touch_action_enabled_ &&
!touch_action_filter_.white_listed_touch_action().has_value()) || !touch_action_filter_.white_listed_touch_action().has_value()) ||
(!compositor_touch_action_enabled_ && (!compositor_touch_action_enabled_ &&
!touch_action_filter_.allowed_touch_action().has_value())) { !touch_action_filter_.allowed_touch_action().has_value())) {
touch_action_filter_.OnSetTouchAction(cc::kTouchActionAuto); touch_action_filter_.OnSetTouchAction(cc::kTouchActionAuto);
touch_action_filter_.OnSetWhiteListedTouchAction(cc::kTouchActionAuto);
if (compositor_touch_action_enabled_) if (compositor_touch_action_enabled_)
touch_event_queue_.StopTimeoutMonitor(); touch_event_queue_.StopTimeoutMonitor();
UpdateTouchAckTimeoutEnabled(); UpdateTouchAckTimeoutEnabled();
......
...@@ -470,7 +470,8 @@ class InputRouterImplTestBase : public testing::Test { ...@@ -470,7 +470,8 @@ class InputRouterImplTestBase : public testing::Test {
void OnTouchEventAckWithAckState( void OnTouchEventAckWithAckState(
InputEventAckSource source, InputEventAckSource source,
InputEventAckState ack_state, InputEventAckState ack_state,
base::Optional<cc::TouchAction> expected_touch_action) { base::Optional<cc::TouchAction> expected_touch_action,
base::Optional<cc::TouchAction> expected_white_listed_touch_action) {
input_router_->OnHasTouchEventHandlers(true); input_router_->OnHasTouchEventHandlers(true);
EXPECT_FALSE(input_router_->AllowedTouchAction().has_value()); EXPECT_FALSE(input_router_->AllowedTouchAction().has_value());
PressTouchPoint(1, 1); PressTouchPoint(1, 1);
...@@ -478,6 +479,8 @@ class InputRouterImplTestBase : public testing::Test { ...@@ -478,6 +479,8 @@ class InputRouterImplTestBase : public testing::Test {
input_router_->OnTouchEventAck(TouchEventWithLatencyInfo(touch_event_), input_router_->OnTouchEventAck(TouchEventWithLatencyInfo(touch_event_),
source, ack_state); source, ack_state);
EXPECT_EQ(input_router_->AllowedTouchAction(), expected_touch_action); EXPECT_EQ(input_router_->AllowedTouchAction(), expected_touch_action);
EXPECT_EQ(input_router_->touch_action_filter_.white_listed_touch_action(),
expected_white_listed_touch_action);
} }
const float radius_x_ = 20.0f; const float radius_x_ = 20.0f;
...@@ -712,7 +715,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumed) { ...@@ -712,7 +715,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumed) {
? InputEventAckSource::COMPOSITOR_THREAD ? InputEventAckSource::COMPOSITOR_THREAD
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_CONSUMED, OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_CONSUMED,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNotConsumed) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNotConsumed) {
...@@ -720,7 +723,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNotConsumed) { ...@@ -720,7 +723,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNotConsumed) {
? InputEventAckSource::COMPOSITOR_THREAD ? InputEventAckSource::COMPOSITOR_THREAD
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_NOT_CONSUMED, OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_NOT_CONSUMED,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumedShouldBubble) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumedShouldBubble) {
...@@ -729,7 +732,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumedShouldBubble) { ...@@ -729,7 +732,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateConsumedShouldBubble) {
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, OnTouchEventAckWithAckState(source,
INPUT_EVENT_ACK_STATE_CONSUMED_SHOULD_BUBBLE, INPUT_EVENT_ACK_STATE_CONSUMED_SHOULD_BUBBLE,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNoConsumerExists) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNoConsumerExists) {
...@@ -737,7 +740,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNoConsumerExists) { ...@@ -737,7 +740,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNoConsumerExists) {
? InputEventAckSource::COMPOSITOR_THREAD ? InputEventAckSource::COMPOSITOR_THREAD
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateIgnored) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateIgnored) {
...@@ -745,7 +748,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateIgnored) { ...@@ -745,7 +748,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateIgnored) {
? InputEventAckSource::COMPOSITOR_THREAD ? InputEventAckSource::COMPOSITOR_THREAD
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_IGNORED, OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_IGNORED,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlocking) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlocking) {
...@@ -753,7 +756,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlocking) { ...@@ -753,7 +756,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlocking) {
? InputEventAckSource::COMPOSITOR_THREAD ? InputEventAckSource::COMPOSITOR_THREAD
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING, OnTouchEventAckWithAckState(source, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlockingDueToFling) { TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlockingDueToFling) {
...@@ -762,7 +765,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlockingDueToFling) { ...@@ -762,7 +765,7 @@ TEST_P(InputRouterImplTest, TouchActionAutoWithAckStateNonBlockingDueToFling) {
: InputEventAckSource::MAIN_THREAD; : InputEventAckSource::MAIN_THREAD;
OnTouchEventAckWithAckState( OnTouchEventAckWithAckState(
source, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING, source, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING_DUE_TO_FLING,
cc::kTouchActionAuto); cc::kTouchActionAuto, cc::kTouchActionAuto);
} }
// Tests that touch-events are sent properly. // Tests that touch-events are sent properly.
......
...@@ -685,13 +685,6 @@ IN_PROC_BROWSER_TEST_P(TouchActionBrowserTest, BlockDoubleTapDragZoom) { ...@@ -685,13 +685,6 @@ IN_PROC_BROWSER_TEST_P(TouchActionBrowserTest, BlockDoubleTapDragZoom) {
DoDoubleTapDragZoom(); DoDoubleTapDragZoom();
// Since we don't expect anything to change, we don't know how long to wait
// before we're sure the zoom was blocked. Do a scroll so that we can wait
// until the offset changes. At that point, we know the zoom should have
// taken effect if it wasn't blocked by touch-action.
DoTouchScroll(gfx::Point(300, 300), gfx::Vector2d(0, 200), true, 10075,
gfx::Vector2d(0, 200), kNoJankTime);
EXPECT_EQ(1, ExecuteScriptAndExtractDouble("window.visualViewport.scale")); EXPECT_EQ(1, ExecuteScriptAndExtractDouble("window.visualViewport.scale"));
} }
......
...@@ -136,6 +136,8 @@ class CONTENT_EXPORT TouchActionFilter { ...@@ -136,6 +136,8 @@ class CONTENT_EXPORT TouchActionFilter {
// sequence due to fling. // sequence due to fling.
base::Optional<cc::TouchAction> active_touch_action_; base::Optional<cc::TouchAction> active_touch_action_;
// TODO(xidachen): consider giving this a default value of Auto, instead of
// Optional.
// Whitelisted touch action received from the compositor. // Whitelisted touch action received from the compositor.
base::Optional<cc::TouchAction> white_listed_touch_action_; base::Optional<cc::TouchAction> white_listed_touch_action_;
......
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