| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/webui/webui_load_timer.h" |
| |
| #include "base/metrics/histogram.h" |
| #include "base/timer/elapsed_timer.h" |
| #include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/web_contents.h" |
| |
| namespace { |
| |
| // Extract UMA_HISTOGRAM_TIMES to allow multiple calls from the same location |
| // with different names. This skips some optimization, but we don't expect to |
| // call this frequently. |
| void CallUmaHistogramTimes(const std::string& name, base::TimeDelta duration) { |
| base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( |
| name, base::Milliseconds(1), base::Seconds(10), 50, |
| base::HistogramBase::kUmaTargetedHistogramFlag); |
| DCHECK(histogram); |
| histogram->AddTime(duration); |
| } |
| |
| } // namespace |
| |
| WebuiLoadTimer::WebuiLoadTimer( |
| content::WebContents* web_contents, |
| const std::string& document_initial_load_uma_id, |
| const std::string& document_load_completed_uma_id) |
| : content::WebContentsObserver(web_contents), |
| document_initial_load_uma_id_(document_initial_load_uma_id), |
| document_load_completed_uma_id_(document_load_completed_uma_id) { |
| DCHECK(!document_initial_load_uma_id_.empty()); |
| DCHECK(!document_load_completed_uma_id_.empty()); |
| } |
| |
| WebuiLoadTimer::~WebuiLoadTimer() = default; |
| |
| void WebuiLoadTimer::DidStartNavigation( |
| content::NavigationHandle* navigation_handle) { |
| if (!navigation_handle->IsInPrimaryMainFrame() || |
| navigation_handle->IsSameDocument()) { |
| return; |
| } |
| timer_ = std::make_unique<base::ElapsedTimer>(); |
| } |
| |
| void WebuiLoadTimer::DOMContentLoaded( |
| content::RenderFrameHost* render_frame_host) { |
| // See comment in DocumentOnLoadCompletedInPrimaryMainFrame. |
| if (!timer_ || !render_frame_host->IsInPrimaryMainFrame()) |
| return; |
| CallUmaHistogramTimes(document_initial_load_uma_id_, timer_->Elapsed()); |
| } |
| |
| void WebuiLoadTimer::DocumentOnLoadCompletedInPrimaryMainFrame() { |
| // The WebContents could have been created for a child RenderFrameHost so it |
| // would never receive a DidStartNavigation with the main frame, however it |
| // will receive this callback. |
| if (!timer_) |
| return; |
| CallUmaHistogramTimes(document_load_completed_uma_id_, timer_->Elapsed()); |
| timer_.reset(); |
| } |