| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ios/chrome/browser/web/load_timing_tab_helper.h" |
| |
| #include "base/logging.h" |
| #include "base/metrics/histogram_macros.h" |
| #import "ios/web/public/web_state/web_state.h" |
| |
| const char LoadTimingTabHelper::kOmnibarToPageLoadedMetric[] = |
| "IOS.PageLoadTiming.OmnibarToPageLoaded"; |
| |
| LoadTimingTabHelper::LoadTimingTabHelper(web::WebState* web_state) |
| : web_state_(web_state) { |
| web_state_->AddObserver(this); |
| } |
| |
| LoadTimingTabHelper::~LoadTimingTabHelper() { |
| DCHECK(!web_state_); |
| } |
| |
| void LoadTimingTabHelper::DidInitiatePageLoad() { |
| load_start_time_ = base::TimeTicks::Now(); |
| } |
| |
| void LoadTimingTabHelper::DidPromotePrerenderTab() { |
| if (web_state_->IsLoading()) { |
| DidInitiatePageLoad(); |
| } else { |
| ReportLoadTime(base::TimeDelta()); |
| ResetTimer(); |
| } |
| } |
| |
| void LoadTimingTabHelper::PageLoaded( |
| web::WebState* web_state, |
| web::PageLoadCompletionStatus load_completion_status) { |
| DCHECK_EQ(web_state_, web_state); |
| if (!load_start_time_.is_null() && |
| load_completion_status == web::PageLoadCompletionStatus::SUCCESS) { |
| ReportLoadTime(base::TimeTicks::Now() - load_start_time_); |
| } |
| ResetTimer(); |
| } |
| |
| void LoadTimingTabHelper::WebStateDestroyed(web::WebState* web_state) { |
| DCHECK_EQ(web_state_, web_state); |
| web_state_->RemoveObserver(this); |
| web_state_ = nullptr; |
| } |
| |
| void LoadTimingTabHelper::ReportLoadTime(const base::TimeDelta& elapsed) { |
| UMA_HISTOGRAM_TIMES(kOmnibarToPageLoadedMetric, elapsed); |
| } |
| |
| void LoadTimingTabHelper::ResetTimer() { |
| load_start_time_ = base::TimeTicks(); |
| } |