summaryrefslogtreecommitdiff
path: root/chromium/ui/events/blink
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/events/blink')
-rw-r--r--chromium/ui/events/blink/blink_event_util.cc27
-rw-r--r--chromium/ui/events/blink/blink_event_util.h6
-rw-r--r--chromium/ui/events/blink/web_input_event.cc8
-rw-r--r--chromium/ui/events/blink/web_input_event_builders_win.cc10
-rw-r--r--chromium/ui/events/blink/web_input_event_builders_win_unittest.cc51
5 files changed, 83 insertions, 19 deletions
diff --git a/chromium/ui/events/blink/blink_event_util.cc b/chromium/ui/events/blink/blink_event_util.cc
index 882781c40b4..a757780a4b9 100644
--- a/chromium/ui/events/blink/blink_event_util.cc
+++ b/chromium/ui/events/blink/blink_event_util.cc
@@ -26,7 +26,8 @@
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/types/event_type.h"
#include "ui/gfx/geometry/angle_conversions.h"
-#include "ui/gfx/geometry/vector2d.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/gfx/transform.h"
using blink::WebGestureDevice;
@@ -473,12 +474,12 @@ WebGestureEvent CreateWebGestureEventFromGestureEventData(
std::unique_ptr<blink::WebInputEvent> ScaleWebInputEvent(
const blink::WebInputEvent& event,
float scale) {
- return TranslateAndScaleWebInputEvent(event, gfx::Vector2d(0, 0), scale);
+ return TranslateAndScaleWebInputEvent(event, gfx::Vector2dF(0, 0), scale);
}
std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
const blink::WebInputEvent& event,
- const gfx::Vector2d& delta,
+ const gfx::Vector2dF& delta,
float scale) {
std::unique_ptr<blink::WebInputEvent> scaled_event;
if (scale == 1.f && delta.IsZero())
@@ -487,9 +488,8 @@ std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
blink::WebMouseWheelEvent* wheel_event = new blink::WebMouseWheelEvent;
scaled_event.reset(wheel_event);
*wheel_event = static_cast<const blink::WebMouseWheelEvent&>(event);
- float x = (wheel_event->PositionInWidget().x() + delta.x()) * scale;
- float y = (wheel_event->PositionInWidget().y() + delta.y()) * scale;
- wheel_event->SetPositionInWidget(x, y);
+ wheel_event->SetPositionInWidget(
+ gfx::ScalePoint(wheel_event->PositionInWidget() + delta, scale));
if (wheel_event->delta_units != ui::ScrollGranularity::kScrollByPage) {
wheel_event->delta_x *= scale;
wheel_event->delta_y *= scale;
@@ -500,9 +500,8 @@ std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
blink::WebMouseEvent* mouse_event = new blink::WebMouseEvent;
scaled_event.reset(mouse_event);
*mouse_event = static_cast<const blink::WebMouseEvent&>(event);
- float x = (mouse_event->PositionInWidget().x() + delta.x()) * scale;
- float y = (mouse_event->PositionInWidget().y() + delta.y()) * scale;
- mouse_event->SetPositionInWidget(x, y);
+ mouse_event->SetPositionInWidget(
+ gfx::ScalePoint(mouse_event->PositionInWidget() + delta, scale));
// Do not scale movement of raw movement events.
if (!mouse_event->is_raw_movement_event) {
mouse_event->movement_x *= scale;
@@ -513,9 +512,8 @@ std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
scaled_event.reset(touch_event);
*touch_event = static_cast<const blink::WebTouchEvent&>(event);
for (unsigned i = 0; i < touch_event->touches_length; i++) {
- touch_event->touches[i].SetPositionInWidget(
- (touch_event->touches[i].PositionInWidget().x() + delta.x()) * scale,
- (touch_event->touches[i].PositionInWidget().y() + delta.y()) * scale);
+ touch_event->touches[i].SetPositionInWidget(gfx::ScalePoint(
+ touch_event->touches[i].PositionInWidget() + delta, scale));
touch_event->touches[i].radius_x *= scale;
touch_event->touches[i].radius_y *= scale;
}
@@ -523,9 +521,8 @@ std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
blink::WebGestureEvent* gesture_event = new blink::WebGestureEvent;
scaled_event.reset(gesture_event);
*gesture_event = static_cast<const blink::WebGestureEvent&>(event);
- gesture_event->SetPositionInWidget(gfx::PointF(
- (gesture_event->PositionInWidget().x() + delta.x()) * scale,
- (gesture_event->PositionInWidget().y() + delta.y()) * scale));
+ gesture_event->SetPositionInWidget(
+ gfx::ScalePoint(gesture_event->PositionInWidget() + delta, scale));
switch (gesture_event->GetType()) {
case blink::WebInputEvent::Type::kGestureScrollUpdate:
if (gesture_event->data.scroll_update.delta_units ==
diff --git a/chromium/ui/events/blink/blink_event_util.h b/chromium/ui/events/blink/blink_event_util.h
index 29ce4a9985c..1982c72c04d 100644
--- a/chromium/ui/events/blink/blink_event_util.h
+++ b/chromium/ui/events/blink/blink_event_util.h
@@ -7,8 +7,8 @@
#include <memory>
-#include "base/optional.h"
#include "build/build_config.h"
+#include "third_party/abseil-cpp/absl/types/optional.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_touch_event.h"
@@ -20,7 +20,7 @@
namespace gfx {
class PointF;
-class Vector2d;
+class Vector2dF;
}
namespace ui {
@@ -59,7 +59,7 @@ std::unique_ptr<blink::WebInputEvent> ScaleWebInputEvent(
// Otherwise, returns the transformed version of |event|.
std::unique_ptr<blink::WebInputEvent> TranslateAndScaleWebInputEvent(
const blink::WebInputEvent& event,
- const gfx::Vector2d& delta,
+ const gfx::Vector2dF& delta,
float scale);
blink::WebInputEvent::Type ToWebMouseEventType(MotionEvent::Action action);
diff --git a/chromium/ui/events/blink/web_input_event.cc b/chromium/ui/events/blink/web_input_event.cc
index a07b99f9d02..cae38e28958 100644
--- a/chromium/ui/events/blink/web_input_event.cc
+++ b/chromium/ui/events/blink/web_input_event.cc
@@ -473,7 +473,13 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent(
// mousewheel events are built in the Windows web input event builder.
// Percent based scrolling is not supported on Mac because the current
// roadmap for scroll personality work is reserved for Windows and Linux.
- if (base::FeatureList::IsEnabled(features::kPercentBasedScrolling)) {
+ // Page based scrolling isn't specified in terms of pixels so we don't convert
+ // deltas to a percentage here - it's resolved into percent, then pixels,
+ // in the renderer.
+ // TODO(yshalivskyy) Currently, for page based scrolling we always scroll
+ // by one page dismissing delta_y/delta_x values. https://crbug.com/1196092
+ if (base::FeatureList::IsEnabled(features::kPercentBasedScrolling) &&
+ webkit_event.delta_units != ui::ScrollGranularity::kScrollByPage) {
webkit_event.delta_units = ui::ScrollGranularity::kScrollByPercentage;
webkit_event.delta_y *=
(kScrollPercentPerLineOrChar / MouseWheelEvent::kWheelDelta);
diff --git a/chromium/ui/events/blink/web_input_event_builders_win.cc b/chromium/ui/events/blink/web_input_event_builders_win.cc
index 619602f3fb6..155402fcb09 100644
--- a/chromium/ui/events/blink/web_input_event_builders_win.cc
+++ b/chromium/ui/events/blink/web_input_event_builders_win.cc
@@ -4,6 +4,8 @@
#include "ui/events/blink/web_input_event_builders_win.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/trace_event/trace_event.h"
#include "base/win/windowsx_shim.h"
#include "ui/base/ui_base_features.h"
#include "ui/display/win/screen_win.h"
@@ -289,10 +291,18 @@ WebMouseWheelEvent WebMouseWheelEventBuilder::Build(
if (horizontal_scroll) {
unsigned long scroll_chars = kDefaultScrollCharsPerWheelDelta;
SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scroll_chars, 0);
+ TRACE_EVENT1("input", "WebMouseWheelEventBuilder::Build", "scroll_chars",
+ scroll_chars);
+ base::UmaHistogramCounts10M("InputMethod.MouseWheel.ScrollCharacters",
+ base::saturated_cast<int>(scroll_chars));
scroll_delta *= static_cast<float>(scroll_chars);
} else {
unsigned long scroll_lines = kDefaultScrollLinesPerWheelDelta;
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scroll_lines, 0);
+ TRACE_EVENT1("input", "WebMouseWheelEventBuilder::Build", "scroll_lines",
+ scroll_lines);
+ base::UmaHistogramCounts10M("InputMethod.MouseWheel.ScrollLines",
+ base::saturated_cast<int>(scroll_lines));
if (scroll_lines == WHEEL_PAGESCROLL)
result.delta_units = ui::ScrollGranularity::kScrollByPage;
else
diff --git a/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc b/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
index b1002c167b7..97feeb3948a 100644
--- a/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
+++ b/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
@@ -4,6 +4,7 @@
#include "ui/events/blink/web_input_event_builders_win.h"
#include "base/command_line.h"
+#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "base/win/windows_version.h"
@@ -88,4 +89,54 @@ TEST(WebInputEventBuilderTest, TestPercentMouseWheelScroll) {
EXPECT_FLOAT_EQ(0.f, mouse_wheel.wheel_ticks_y);
}
+void VerifyWebMouseWheelEventBuilderHistograms(
+ UINT message,
+ blink::WebPointerProperties::PointerType type,
+ const char* histogram,
+ std::vector<int>& event_timestamps_in_ms,
+ std::map<int, int>& histogram_expectations) {
+ base::HistogramTester histogram_tester;
+
+ EXPECT_TRUE(event_timestamps_in_ms.size() > 0 &&
+ histogram_expectations.size() > 0);
+ for (int event_timestamp : event_timestamps_in_ms) {
+ WebMouseWheelEventBuilder::Build(
+ ::GetDesktopWindow(), message, MAKEWPARAM(0, -WHEEL_DELTA),
+ MAKELPARAM(0, 0),
+ base::TimeTicks() + base::TimeDelta::FromMilliseconds(event_timestamp),
+ type);
+ }
+
+ for (std::map<int, int>::iterator it = histogram_expectations.begin();
+ it != histogram_expectations.end(); ++it) {
+ // Key is the (unique) velocity bucket.
+ // Value is the count of data points for that bucket.
+ EXPECT_EQ(histogram_tester.GetBucketCount(histogram, it->first),
+ it->second);
+ }
+}
+
+TEST(WebInputEventBuilderTest, TestMouseWheelScrollHistograms) {
+ // Tests mouse wheel horizontal scrolling logging.
+ unsigned long scroll_chars = 1;
+ SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scroll_chars, 0);
+ std::vector<int> event_timestamps = {300, 600, 900, 1200};
+ std::map<int, int> histogram_expectations = {
+ {scroll_chars - 1, 0}, {scroll_chars, 4}, {scroll_chars + 1, 0}};
+ VerifyWebMouseWheelEventBuilderHistograms(
+ WM_HSCROLL, blink::WebPointerProperties::PointerType::kTouch,
+ "InputMethod.MouseWheel.ScrollCharacters", event_timestamps,
+ histogram_expectations);
+ // Tests mouse wheel vertical scrolling logging.
+ unsigned long scroll_lines = 1;
+ SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scroll_lines, 0);
+ histogram_expectations.clear();
+ histogram_expectations = {
+ {scroll_lines - 1, 0}, {scroll_lines, 4}, {scroll_lines + 1, 0}};
+ VerifyWebMouseWheelEventBuilderHistograms(
+ WM_VSCROLL, blink::WebPointerProperties::PointerType::kTouch,
+ "InputMethod.MouseWheel.ScrollLines", event_timestamps,
+ histogram_expectations);
+}
+
} // namespace ui