blob: 8d7d16614735cb18b4c67fb9c35b28bbf927e5e7 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/events/blink/blink_event_util.h"
#include <array>
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/input/web_gesture_event.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "third_party/blink/public/common/input/web_mouse_wheel_event.h"
#include "third_party/blink/public/common/input/web_pointer_event.h"
#include "ui/events/gesture_event_details.h"
namespace ui {
using BlinkEventUtilTest = testing::Test;
TEST(BlinkEventUtilTest, NoScalingWith1DSF) {
ui::GestureEventDetails details(ui::EventType::kGestureScrollUpdate, 1, 1);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details,
base::TimeTicks(),
gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f),
0,
0U);
EXPECT_FALSE(ScaleWebInputEvent(event, 1.f));
EXPECT_TRUE(ScaleWebInputEvent(event, 2.f));
}
TEST(BlinkEventUtilTest, NonPaginatedWebMouseWheelEvent) {
blink::WebMouseWheelEvent event(
blink::WebInputEvent::Type::kMouseWheel,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
event.delta_units = ui::ScrollGranularity::kScrollByPixel;
event.delta_x = 1.f;
event.delta_y = 1.f;
event.wheel_ticks_x = 1.f;
event.wheel_ticks_y = 1.f;
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebMouseWheelEvent* mouseWheelEvent =
static_cast<blink::WebMouseWheelEvent*>(webEvent.get());
EXPECT_EQ(2.f, mouseWheelEvent->delta_x);
EXPECT_EQ(2.f, mouseWheelEvent->delta_y);
EXPECT_EQ(2.f, mouseWheelEvent->wheel_ticks_x);
EXPECT_EQ(2.f, mouseWheelEvent->wheel_ticks_y);
}
TEST(BlinkEventUtilTest, PaginatedWebMouseWheelEvent) {
blink::WebMouseWheelEvent event(
blink::WebInputEvent::Type::kMouseWheel,
blink::WebInputEvent::kNoModifiers,
blink::WebInputEvent::GetStaticTimeStampForTests());
event.delta_units = ui::ScrollGranularity::kScrollByPage;
event.delta_x = 1.f;
event.delta_y = 1.f;
event.wheel_ticks_x = 1.f;
event.wheel_ticks_y = 1.f;
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebMouseWheelEvent* mouseWheelEvent =
static_cast<blink::WebMouseWheelEvent*>(webEvent.get());
EXPECT_EQ(1.f, mouseWheelEvent->delta_x);
EXPECT_EQ(1.f, mouseWheelEvent->delta_y);
EXPECT_EQ(1.f, mouseWheelEvent->wheel_ticks_x);
EXPECT_EQ(1.f, mouseWheelEvent->wheel_ticks_y);
}
TEST(BlinkEventUtilTest, NonPaginatedScrollBeginEvent) {
ui::GestureEventDetails details(ui::EventType::kGestureScrollBegin, 1, 1);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details, base::TimeTicks(), gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebGestureEvent* gestureEvent =
static_cast<blink::WebGestureEvent*>(webEvent.get());
EXPECT_EQ(2.f, gestureEvent->data.scroll_begin.delta_x_hint);
EXPECT_EQ(2.f, gestureEvent->data.scroll_begin.delta_y_hint);
}
TEST(BlinkEventUtilTest, PaginatedScrollBeginEvent) {
ui::GestureEventDetails details(ui::EventType::kGestureScrollBegin, 1, 1,
ui::ScrollGranularity::kScrollByPage);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details, base::TimeTicks(), gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebGestureEvent* gestureEvent =
static_cast<blink::WebGestureEvent*>(webEvent.get());
EXPECT_EQ(1.f, gestureEvent->data.scroll_begin.delta_x_hint);
EXPECT_EQ(1.f, gestureEvent->data.scroll_begin.delta_y_hint);
}
TEST(BlinkEventUtilTest, EnsureFlingVelocityNotNaN) {
float nan_number = std::nanf("");
ui::GestureEventDetails details(ui::EventType::kScrollFlingStart, nan_number,
1.f);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details, base::TimeTicks(), gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
EXPECT_EQ(std::numeric_limits<float>::max(),
event.data.fling_start.velocity_x);
EXPECT_EQ(1.f, event.data.fling_start.velocity_y);
}
TEST(BlinkEventUtilTest, NonPaginatedScrollUpdateEvent) {
ui::GestureEventDetails details(ui::EventType::kGestureScrollUpdate, 1, 1);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details, base::TimeTicks(), gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebGestureEvent* gestureEvent =
static_cast<blink::WebGestureEvent*>(webEvent.get());
EXPECT_EQ(2.f, gestureEvent->data.scroll_update.delta_x);
EXPECT_EQ(2.f, gestureEvent->data.scroll_update.delta_y);
}
TEST(BlinkEventUtilTest, PaginatedScrollUpdateEvent) {
ui::GestureEventDetails details(ui::EventType::kGestureScrollUpdate, 1, 1,
ui::ScrollGranularity::kScrollByPage);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event =
CreateWebGestureEvent(details, base::TimeTicks(), gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebGestureEvent* gestureEvent =
static_cast<blink::WebGestureEvent*>(webEvent.get());
EXPECT_EQ(1.f, gestureEvent->data.scroll_update.delta_x);
EXPECT_EQ(1.f, gestureEvent->data.scroll_update.delta_y);
}
TEST(BlinkEventUtilTest, LineAndDocumentScrollEvents) {
static const auto types = std::to_array<ui::EventType>({
ui::EventType::kGestureScrollBegin,
ui::EventType::kGestureScrollUpdate,
});
static const auto units = std::to_array<ui::ScrollGranularity>({
ui::ScrollGranularity::kScrollByLine,
ui::ScrollGranularity::kScrollByDocument,
});
for (size_t i = 0; i < std::size(types); i++) {
ui::EventType type = types[i];
for (size_t j = 0; j < std::size(units); j++) {
ui::ScrollGranularity unit = units[j];
ui::GestureEventDetails details(type, 1, 1, unit);
details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN);
auto event = CreateWebGestureEvent(details, base::TimeTicks(),
gfx::PointF(1.f, 1.f),
gfx::PointF(1.f, 1.f), 0, 0U);
std::unique_ptr<blink::WebInputEvent> webEvent =
ScaleWebInputEvent(event, 2.f);
EXPECT_TRUE(webEvent);
blink::WebGestureEvent* gestureEvent =
static_cast<blink::WebGestureEvent*>(webEvent.get());
// Line and document based scroll events should not be scaled.
if (type == ui::EventType::kGestureScrollBegin) {
EXPECT_EQ(1.f, gestureEvent->data.scroll_begin.delta_x_hint);
EXPECT_EQ(1.f, gestureEvent->data.scroll_begin.delta_y_hint);
} else {
EXPECT_TRUE(type == ui::EventType::kGestureScrollUpdate);
EXPECT_EQ(1.f, gestureEvent->data.scroll_update.delta_x);
EXPECT_EQ(1.f, gestureEvent->data.scroll_update.delta_y);
}
}
}
}
TEST(BlinkEventUtilTest, WebEventModifersAndEventFlags) {
using WebInputEvent = blink::WebInputEvent;
constexpr int kWebEventModifiersToTest[] = {WebInputEvent::kShiftKey,
WebInputEvent::kControlKey,
WebInputEvent::kAltKey,
WebInputEvent::kAltGrKey,
WebInputEvent::kMetaKey,
WebInputEvent::kCapsLockOn,
WebInputEvent::kNumLockOn,
WebInputEvent::kScrollLockOn,
WebInputEvent::kLeftButtonDown,
WebInputEvent::kMiddleButtonDown,
WebInputEvent::kRightButtonDown,
WebInputEvent::kBackButtonDown,
WebInputEvent::kForwardButtonDown,
WebInputEvent::kIsAutoRepeat};
// For each WebEventModifier value, test that it maps to a unique ui::Event
// flag, and that the flag correctly maps back to the WebEventModifier.
int event_flags = 0;
for (int event_modifier : kWebEventModifiersToTest) {
int event_flag = WebEventModifiersToEventFlags(event_modifier);
// |event_flag| must be unique.
EXPECT_EQ(event_flags & event_flag, 0);
event_flags |= event_flag;
// |event_flag| must map to |event_modifier|.
EXPECT_EQ(EventFlagsToWebEventModifiers(event_flag), event_modifier);
}
}
} // namespace ui