blink scheduler: Add TimeSinceBackgrounded to RendererSchedulerTask UKM.

This was previously approved at [1] by msramek@.

[1] https://docs.google.com/document/d/14c_oWM2B02_mp43bPLcUiN6-094djfnzpbu9SAwH5-4/edit?ts=5a54f254#

Bug: 832162
Change-Id: I8f0f29af540a2e6f817b5e0b470683ad68a581b2
Reviewed-on: https://chromium-review.googlesource.com/1079068
Reviewed-by: Alexander Timin <altimin@chromium.org>
Reviewed-by: Robert Kaplow <rkaplow@chromium.org>
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#563181}
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index b181305..4dc1e2a 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -63,6 +63,7 @@
 constexpr base::TimeDelta kQueueingTimeWindowDuration =
     base::TimeDelta::FromSeconds(1);
 const double kSamplingRateForTaskUkm = 0.0001;
+const int64_t kSecondsPerMinute = 60;
 
 // Field trial name.
 const char kWakeUpThrottlingTrial[] = "RendererSchedulerWakeUpThrottling";
@@ -2603,6 +2604,23 @@
       GetFrameStatus(queue ? queue->GetFrameScheduler() : nullptr)));
   builder.SetTaskDuration((end - start).InMicroseconds());
 
+  if (main_thread_only().renderer_backgrounded) {
+    base::TimeDelta time_since_backgrounded =
+        (end - main_thread_only().background_status_changed_at);
+
+    // Trade off for privacy: Round to seconds for times below 10 minutes and
+    // minutes afterwards.
+    int seconds_since_backgrounded = 0;
+    if (time_since_backgrounded < base::TimeDelta::FromMinutes(10)) {
+      seconds_since_backgrounded = time_since_backgrounded.InSeconds();
+    } else {
+      seconds_since_backgrounded =
+          time_since_backgrounded.InMinutes() * kSecondsPerMinute;
+    }
+
+    builder.SetSecondsSinceBackgrounded(seconds_since_backgrounded);
+  }
+
   if (thread_time) {
     builder.SetTaskCPUDuration(thread_time->InMicroseconds());
   }
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 10508cf..be86def 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -2693,20 +2693,26 @@
   </metric>
   <metric name="RendererAudible">
     <summary>
-      Whether renderer was playing audio when this task was run. Boolean,
+      Whether renderer was playing audio when this task was completed. Boolean,
       encoded as an integer (0/1).
     </summary>
   </metric>
   <metric name="RendererBackgrounded">
     <summary>
-      Whether renderer was backgrounded when this task was run. Boolean, encoded
-      as an integer (0/1).
+      Whether renderer was backgrounded when this task was completed. Boolean,
+      encoded as an integer (0/1).
     </summary>
   </metric>
   <metric name="RendererHidden">
     <summary>
-      Whether renderer was hidden when this task was run. Boolean, encoded as an
-      integer (0/1).
+      Whether renderer was hidden when this task was completed. Boolean, encoded
+      as an integer (0/1).
+    </summary>
+  </metric>
+  <metric name="SecondsSinceBackgrounded">
+    <summary>
+      Seconds since the renderer was backgrounded, recorded when the task was
+      completed. Only set if the renderer is backgrounded.
     </summary>
   </metric>
   <metric name="TaskCPUDuration">
@@ -2726,7 +2732,7 @@
   </metric>
   <metric name="UseCase">
     <summary>
-      MainThreadSchedulerImpl's UseCase when this task was run. See
+      MainThreadSchedulerImpl's UseCase when this task was completed. See
       blink::scheduler::UseCase for the values of this enum.
     </summary>
   </metric>