[go: nahoru, domu]

Added check for out of order event handling in average_lag_tracker.

The average_lag_tracker assumes that all events have nondecreasing
timestamps. However, the assumption breaks when the main thread takes a
long time to handle a scroll update and the compositor thread starts a
new scroll in the meantime.

This CL removes the invalid DCHECK and instead ignores the out-of-order
event.

Bug: 1015492
Change-Id: I3dcee2be9c0ba9b6e295d391b4c114f7ef05510b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1869378
Reviewed-by: Daniel Libby <dlibby@microsoft.com>
Reviewed-by: Ella Ge <eirage@chromium.org>
Reviewed-by: Navid Zolghadr <nzolghadr@chromium.org>
Commit-Queue: Daniel Libby <dlibby@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#712910}
diff --git a/ui/latency/average_lag_tracker_unittest.cc b/ui/latency/average_lag_tracker_unittest.cc
index f5551a4..e2a0f223 100644
--- a/ui/latency/average_lag_tracker_unittest.cc
+++ b/ui/latency/average_lag_tracker_unittest.cc
@@ -495,5 +495,46 @@
       "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
 }
 
+// Tests that when an event arrives out-of-order, the average lag tracker
+// properly ignores it.
+TEST_F(AverageLagTrackerTest, EventOutOfOrder) {
+  base::TimeTicks event_time = MillisecondsToTimeTicks(5);
+  base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
+  float scroll_delta = 5.f;
+  SyntheticTouchScrollBeginLatencyInfo(event_time, frame_time, scroll_delta);
+
+  event_time = MillisecondsToTimeTicks(15);
+  frame_time = MillisecondsToTimeTicks(20);
+  SyntheticTouchScrollUpdateLatencyInfo(event_time, frame_time, scroll_delta);
+
+  event_time = MillisecondsToTimeTicks(25);
+  frame_time = MillisecondsToTimeTicks(30);
+  SyntheticTouchScrollUpdateLatencyInfo(event_time, frame_time, scroll_delta);
+
+  // A ScrollBegin to flush unfinished frames.
+  event_time = MillisecondsToTimeTicks(1000);
+  frame_time = MillisecondsToTimeTicks(1000);
+  SyntheticTouchScrollBeginLatencyInfo(event_time, frame_time, 0);
+
+  histogram_tester().ExpectTotalCount(
+      "Event.Latency.ScrollUpdate.Touch.AverageLag", 1);
+
+  // Send an event whose timestamp is earlier than the most recent event,
+  // representing an event that gets process out of order.
+  base::TimeTicks earlier_event_time = MillisecondsToTimeTicks(15);
+  frame_time = MillisecondsToTimeTicks(1010);
+  SyntheticTouchScrollUpdateLatencyInfo(earlier_event_time, frame_time,
+                                        scroll_delta);
+
+  // Another ScrollBegin to flush unfinished frames.
+  event_time = MillisecondsToTimeTicks(2000);
+  frame_time = MillisecondsToTimeTicks(2000);
+  SyntheticTouchScrollBeginLatencyInfo(event_time, frame_time, 0);
+
+  // Ensure that the event was ignored.
+  histogram_tester().ExpectTotalCount(
+      "Event.Latency.ScrollUpdate.Touch.AverageLag", 1);
+}
+
 }  // namespace
 }  // namespace ui