Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
index b3812dc5780262f6b79143108f71885aee99d4b6..fe50e03b54d6bc55ec9bcb622ef9c8ffad553500 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -14,6 +14,7 @@ |
#include "base/trace_event/trace_event.h" |
#include "base/trace_event/trace_event_argument.h" |
#include "cc/output/begin_frame_args.h" |
+#include "components/metrics/single_sample_metrics_factory_impl.h" |
#include "platform/RuntimeEnabledFeatures.h" |
#include "platform/scheduler/base/real_time_domain.h" |
#include "platform/scheduler/base/task_queue_impl.h" |
@@ -217,6 +218,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
in_idle_period_for_testing(false), |
use_virtual_time(false), |
is_audio_playing(false), |
+ has_navigated(false), |
rail_mode_observer(nullptr), |
wake_up_budget_pool(nullptr), |
task_duration_per_queue_type_histogram(base::Histogram::FactoryGet( |
@@ -1631,6 +1633,25 @@ void RendererSchedulerImpl::RemovePendingNavigation(NavigatingFrameType type) { |
} |
} |
+void RendererSchedulerImpl::OnCommitProvisionalLoad() { |
+ // Initialize |max_queueing_time_histogram| as we need it so that |
+ // |SingleSampleMetricsFactory::SetFactory()| is called before |
+ // |SingleSampleMetricsFactory::Get()| |
+ if (!GetMainThreadOnly().max_queueing_time_histogram) { |
+ GetMainThreadOnly().max_queueing_time_histogram = |
+ GetMaxQueueingTimeHistogram(); |
+ } |
+ GetMainThreadOnly().max_queueing_time_histogram.reset(); |
+ GetMainThreadOnly().max_queueing_time = base::TimeDelta(); |
+ GetMainThreadOnly().has_navigated = true; |
+} |
+ |
+std::unique_ptr<base::SingleSampleMetric> |
+RendererSchedulerImpl::GetMaxQueueingTimeHistogram() { |
+ return base::SingleSampleMetricsFactory::Get()->CreateCustomCountsMetric( |
+ "RendererScheduler.MaxQueueingTime", 1, 10000, 50); |
+} |
+ |
void RendererSchedulerImpl::OnNavigationStarted() { |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererSchedulerImpl::OnNavigationStarted"); |
@@ -1904,6 +1925,17 @@ void RendererSchedulerImpl::RemoveTaskTimeObserver( |
void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( |
base::TimeDelta queueing_time, |
base::TimeTicks window_start_time) { |
+ if (GetMainThreadOnly().has_navigated) { |
+ if (GetMainThreadOnly().max_queueing_time < queueing_time) { |
+ if (!GetMainThreadOnly().max_queueing_time_histogram) { |
+ GetMainThreadOnly().max_queueing_time_histogram = |
+ GetMaxQueueingTimeHistogram(); |
+ } |
+ GetMainThreadOnly().max_queueing_time_histogram->SetSample( |
+ GetMainThreadOnly().max_queueing_time.InMilliseconds()); |
+ GetMainThreadOnly().max_queueing_time = queueing_time; |
+ } |
+ } |
// RendererScheduler reports the queueing time once per window's duration. |
// |stepEQT|stepEQT|stepEQT|stepEQT|stepEQT|stepEQT| |
// Report: |-------window EQT------| |