Use absolute value for intermediate AverageLag values

Area values generally should not be negative. With the existing code,
changes of direction during a report period will cancel out previously
accumulated lag.

Bug: 928843

Change-Id: I779d16b08e47c38fe0c33e807b5d8241fd5110cb
Reviewed-on: https://chromium-review.googlesource.com/c/1450751
Reviewed-by: Ella Ge <eirage@chromium.org>
Reviewed-by: Timothy Dresser <tdresser@chromium.org>
Commit-Queue: Daniel Libby <dlibby@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#629702}
diff --git a/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc b/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
index 5da41d3..33662f3 100644
--- a/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
+++ b/content/browser/renderer_host/input/render_widget_host_latency_tracker_unittest.cc
@@ -1237,13 +1237,15 @@
   }
   // Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
   // per 1 second.
-  for (int i = 0; i <= 100; i++) {
+  const int kUpdates = 101;
+  for (int i = 0; i < kUpdates; i++) {
     // ScrollUpdate
     SyntheticWebTouchEvent touch;
     touch.PressPoint(0, 0);
     ui::LatencyInfo touch_latency(ui::SourceEventType::TOUCH);
 
-    touch_latency.set_scroll_update_delta(10);
+    const int sign = (i < kUpdates / 2) ? 1 : -1;
+    touch_latency.set_scroll_update_delta(sign * 10);
     event_time += base::TimeDelta::FromMilliseconds(10);
     touch_latency.AddLatencyNumberWithTimestamp(
         ui::INPUT_EVENT_LATENCY_SCROLL_UPDATE_ORIGINAL_COMPONENT, event_time,
diff --git a/ui/latency/latency_tracker.cc b/ui/latency/latency_tracker.cc
index 88d8346..d98a8e0 100644
--- a/ui/latency/latency_tracker.cc
+++ b/ui/latency/latency_tracker.cc
@@ -369,7 +369,7 @@
     // creation time and gpu swap begin time.
     pending_finished_lag_report_->lag =
         (gpu_swap_begin_timestamp - event_timestamp).InMillisecondsF() *
-        latency.scroll_update_delta();
+        std::abs(latency.scroll_update_delta());
     // The next report time should be a least 1 second away from current report
     // time.
     next_report_time_ = pending_finished_lag_report_->report_time +
@@ -386,14 +386,14 @@
     // average delta(current delta/2).
     float pending_finger_move_lag =
         (event_timestamp - last_event_timestamp_).InMillisecondsF() *
-        latency.scroll_update_delta() / 2;
+        std::abs(latency.scroll_update_delta() / 2);
 
     // |event_dispatch_lag| is the area between the current event creation time
     // (i.e. last coalesced event of current event creation time) and gpu swap
     // begin time of this event.
     float event_dispatch_lag =
         (gpu_swap_begin_timestamp - event_timestamp).InMillisecondsF() *
-        latency.scroll_update_delta();
+        std::abs(latency.scroll_update_delta());
 
     if (pending_finished_lag_report_) {
       if (event_timestamp >= pending_finished_lag_report_->report_time) {
@@ -421,7 +421,7 @@
             (gpu_swap_begin_timestamp -
              pending_finished_lag_report_->report_time)
                 .InMillisecondsF() *
-            latency.scroll_update_delta();
+            std::abs(latency.scroll_update_delta());
         pending_finished_lag_report_->lag += pending_finger_move_lag +
                                              event_dispatch_lag -
                                              lag_after_report_time;
@@ -460,9 +460,10 @@
 void LatencyTracker::ReportAverageLagUma(std::unique_ptr<LagData> report) {
   if (report) {
     DCHECK(!report->report_time.is_null());
+    DCHECK(report->lag >= 0.f);
     base::UmaHistogramCounts1000(
         "Event.Latency." + report->scroll_name + ".Touch.AverageLag",
-        std::abs(report->lag) /
+        report->lag /
             (report->report_time - last_reported_time_).InMillisecondsF());
 
     last_reported_time_ = report->report_time;