// Copyright 2017 The Chromium Authors
// 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/model/load_timing_tab_helper.h"

#import "base/check_op.h"
#import "base/metrics/histogram_macros.h"
#import "ios/web/public/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(base::TimeDelta elapsed) {
  UMA_HISTOGRAM_TIMES(kOmnibarToPageLoadedMetric, elapsed);
}

void LoadTimingTabHelper::ResetTimer() {
  load_start_time_ = base::TimeTicks();
}
