diff options
Diffstat (limited to 'chromium/ui/events/blink')
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 |