chromium/ios/chrome/browser/metrics/model/ios_chrome_stability_metrics_provider.mm

// Copyright 2015 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/metrics/model/ios_chrome_stability_metrics_provider.h"

#import "base/feature_list.h"
#import "base/metrics/histogram_macros.h"
#import "ios/chrome/browser/shared/model/url/chrome_url_constants.h"
#import "ios/components/webui/web_ui_url_constants.h"
#import "ios/web/common/features.h"
#import "ios/web/public/navigation/navigation_context.h"
#import "url/gurl.h"

// Name of the UMA enum histogram that counts DidStartNavigation events by type.
const char IOSChromeStabilityMetricsProvider::kPageLoadCountMetric[] =
    "IOS.PageLoadCount.Counts";
// Name of the UMA enum history that counts DidStartLoading events.
const char
    IOSChromeStabilityMetricsProvider::kPageLoadCountLoadingStartedMetric[] =
        "IOS.PageLoadCount.LoadingStarted";

IOSChromeStabilityMetricsProvider::IOSChromeStabilityMetricsProvider(
    PrefService* local_state)
    : helper_(local_state), recording_enabled_(false) {}

IOSChromeStabilityMetricsProvider::~IOSChromeStabilityMetricsProvider() {}

void IOSChromeStabilityMetricsProvider::OnRecordingEnabled() {
  recording_enabled_ = true;
}

void IOSChromeStabilityMetricsProvider::OnRecordingDisabled() {
  recording_enabled_ = false;
}

void IOSChromeStabilityMetricsProvider::LogRendererCrash() {
  if (!recording_enabled_)
    return;

  helper_.LogRendererCrash();
}

void IOSChromeStabilityMetricsProvider::WebStateDidStartLoading(
    web::WebState* web_state) {
  if (!recording_enabled_)
    return;

  UMA_HISTOGRAM_BOOLEAN(kPageLoadCountLoadingStartedMetric, true);
}

void IOSChromeStabilityMetricsProvider::WebStateDidStartNavigation(
    web::WebState* web_state,
    web::NavigationContext* navigation_context) {
  if (!recording_enabled_)
    return;

  PageLoadCountNavigationType type =
      PageLoadCountNavigationType::PAGE_LOAD_NAVIGATION;
  if (navigation_context->GetUrl().SchemeIs(kChromeUIScheme)) {
    type = PageLoadCountNavigationType::CHROME_URL_NAVIGATION;
  } else if (navigation_context->IsSameDocument()) {
    type = PageLoadCountNavigationType::SAME_DOCUMENT_WEB_NAVIGATION;
  } else {
    helper_.LogLoadStarted();
  }
  UMA_HISTOGRAM_ENUMERATION(kPageLoadCountMetric, type,
                            PageLoadCountNavigationType::COUNT);
}

void IOSChromeStabilityMetricsProvider::RenderProcessGone(
    web::WebState* web_state) {
  if (!recording_enabled_)
    return;
  LogRendererCrash();
  // TODO(crbug.com/41297697): web_state->GetLastCommittedURL() is likely the
  // URL that caused a renderer crash and can be logged here.
}