Commit 6c1aaacd authored by Ella Ge's avatar Ella Ge Committed by Commit Bot

Make AverageLag count scroll prediction change

AverageLag are calculated from latency_info.scroll_update_delta.
It was set from GestureScrollUpdate event's delta_y; however, scroll
prediction is done after scroll_update_delta set, which means the
AverageLag did not count in the prediction result.

This CL adds setting the scroll_update_delta from GSU, so it will
count in the prediction change as well.

Bug: 836352
Change-Id: I979e0da617dbfdfa6735aee33958cb9dac9b8331
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1509102Reviewed-by: default avatarNavid Zolghadr <nzolghadr@chromium.org>
Commit-Queue: Ella Ge <eirage@chromium.org>
Cr-Commit-Position: refs/heads/master@{#638732}
parent 0904d89a
...@@ -261,6 +261,14 @@ void InputHandlerProxy::DispatchSingleInputEvent( ...@@ -261,6 +261,14 @@ void InputHandlerProxy::DispatchSingleInputEvent(
std::unique_ptr<EventWithCallback> event_with_callback, std::unique_ptr<EventWithCallback> event_with_callback,
const base::TimeTicks now) { const base::TimeTicks now) {
ui::LatencyInfo monitored_latency_info = event_with_callback->latency_info(); ui::LatencyInfo monitored_latency_info = event_with_callback->latency_info();
if (event_with_callback->event().GetType() ==
WebInputEvent::kGestureScrollUpdate) {
monitored_latency_info.set_scroll_update_delta(
static_cast<const WebGestureEvent&>(event_with_callback->event())
.data.scroll_update.delta_y);
}
std::unique_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor = std::unique_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor =
input_handler_->CreateLatencyInfoSwapPromiseMonitor( input_handler_->CreateLatencyInfoSwapPromiseMonitor(
&monitored_latency_info); &monitored_latency_info);
......
...@@ -1916,6 +1916,67 @@ TEST_F(InputHandlerProxyEventQueueTest, ScrollPredictorTest) { ...@@ -1916,6 +1916,67 @@ TEST_F(InputHandlerProxyEventQueueTest, ScrollPredictorTest) {
testing::Mock::VerifyAndClearExpectations(&mock_input_handler_); testing::Mock::VerifyAndClearExpectations(&mock_input_handler_);
} }
TEST_F(InputHandlerProxyEventQueueTest, LatencyInfoScrollUpdateDelta) {
// Scroll on compositor.
cc::InputHandlerScrollResult scroll_result_did_scroll_;
scroll_result_did_scroll_.did_scroll = true;
EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_))
.WillOnce(testing::Return(kImplThreadScrollState));
EXPECT_CALL(mock_input_handler_, SetNeedsAnimateInput()).Times(1);
EXPECT_CALL(
mock_input_handler_,
ScrollBy(testing::Property(&cc::ScrollState::delta_y, testing::Gt(0))))
.WillOnce(testing::Return(scroll_result_did_scroll_));
EXPECT_CALL(mock_input_handler_, ScrollEnd(testing::_, true));
HandleGestureEvent(WebInputEvent::kGestureScrollBegin);
HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -20);
HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -40);
HandleGestureEvent(WebInputEvent::kGestureScrollEnd);
input_handler_proxy_->DeliverInputForBeginFrame();
EXPECT_EQ(0ul, event_queue().size());
// Should run callbacks for every original events.
EXPECT_EQ(4ul, event_disposition_recorder_.size());
EXPECT_EQ(4ul, latency_info_recorder_.size());
EXPECT_EQ(false, latency_info_recorder_[1].coalesced());
EXPECT_EQ(-60, latency_info_recorder_[1].scroll_update_delta());
EXPECT_EQ(true, latency_info_recorder_[2].coalesced());
EXPECT_EQ(-60, latency_info_recorder_[2].scroll_update_delta());
testing::Mock::VerifyAndClearExpectations(&mock_input_handler_);
latency_info_recorder_.clear();
// Scroll on main thread.
cc::InputHandlerScrollResult scroll_result_did_not_scroll_;
scroll_result_did_not_scroll_.did_scroll = false;
EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_))
.WillOnce(testing::Return(kMainThreadScrollState));
EXPECT_CALL(mock_input_handler_, ScrollEnd(testing::_, true));
HandleGestureEvent(WebInputEvent::kGestureScrollBegin);
HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -20);
HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, -40);
HandleGestureEvent(WebInputEvent::kGestureScrollEnd);
input_handler_proxy_->DeliverInputForBeginFrame();
EXPECT_EQ(0ul, event_queue().size());
// Should run callbacks for every original events.
EXPECT_EQ(8ul, event_disposition_recorder_.size());
EXPECT_EQ(4ul, latency_info_recorder_.size());
EXPECT_EQ(false, latency_info_recorder_[1].coalesced());
EXPECT_EQ(-20, latency_info_recorder_[1].scroll_update_delta());
EXPECT_EQ(false, latency_info_recorder_[2].coalesced());
EXPECT_EQ(-40, latency_info_recorder_[2].scroll_update_delta());
testing::Mock::VerifyAndClearExpectations(&mock_input_handler_);
}
class InputHandlerProxyMainThreadScrollingReasonTest class InputHandlerProxyMainThreadScrollingReasonTest
: public InputHandlerProxyTest { : public InputHandlerProxyTest {
public: public:
......
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