blob: a07ef09dfbe9ed1dc5bf25eff458ec59b94221ee [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/renderer_host/input/touch_action_filter.h"
#include "content/common/input/synthetic_web_input_event_builders.h"
#include "content/port/browser/event_with_latency_info.h"
#include "content/port/common/input_event_ack_state.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
using blink::WebGestureEvent;
using blink::WebInputEvent;
namespace content {
TEST(TouchActionFilterTest, SimpleFilter) {
TouchActionFilter filter;
const WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen);
const WebGestureEvent scroll_update =
SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0);
const WebGestureEvent scroll_end = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen);
const WebGestureEvent tap = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::GestureTap, WebGestureEvent::Touchscreen);
// No events filtered by default.
EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_update));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_end));
EXPECT_FALSE(filter.FilterGestureEvent(tap));
// TOUCH_ACTION_AUTO doesn't cause any filtering.
filter.OnSetTouchAction(TOUCH_ACTION_AUTO);
EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_update));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_end));
// TOUCH_ACTION_NONE filters out all scroll events, but no other events.
filter.OnSetTouchAction(TOUCH_ACTION_NONE);
EXPECT_FALSE(filter.FilterGestureEvent(tap));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_end));
// After the end of a gesture the state is reset.
EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_update));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_end));
// Setting touch action doesn't impact any in-progress gestures.
EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin));
filter.OnSetTouchAction(TOUCH_ACTION_NONE);
EXPECT_FALSE(filter.FilterGestureEvent(scroll_update));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_end));
// And the state is still cleared for the next gesture.
EXPECT_FALSE(filter.FilterGestureEvent(scroll_begin));
EXPECT_FALSE(filter.FilterGestureEvent(scroll_end));
// Changing the touch action during a gesture has no effect.
filter.OnSetTouchAction(TOUCH_ACTION_NONE);
EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin));
filter.OnSetTouchAction(TOUCH_ACTION_AUTO);
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_end));
}
TEST(TouchActionFilterTest, MultiTouch) {
TouchActionFilter filter;
const WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::GestureScrollBegin, WebGestureEvent::Touchscreen);
const WebGestureEvent scroll_update =
SyntheticWebGestureEventBuilder::BuildScrollUpdate(0, 10, 0);
const WebGestureEvent scrollEnd = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::GestureScrollEnd, WebGestureEvent::Touchscreen);
// For multiple points, the intersection is what matters.
filter.OnSetTouchAction(TOUCH_ACTION_NONE);
filter.OnSetTouchAction(TOUCH_ACTION_AUTO);
EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd));
filter.OnSetTouchAction(TOUCH_ACTION_AUTO);
filter.OnSetTouchAction(TOUCH_ACTION_NONE);
filter.OnSetTouchAction(TOUCH_ACTION_AUTO);
EXPECT_TRUE(filter.FilterGestureEvent(scroll_begin));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scroll_update));
EXPECT_TRUE(filter.FilterGestureEvent(scrollEnd));
}
} // namespace content