blob: 7eab43d152848451ace56bc090520564d6396752 [file] [log] [blame]
// Copyright 2015 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.
#ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_PAGE_LOAD_METRICS_OBSERVER_H_
#define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_PAGE_LOAD_METRICS_OBSERVER_H_
#include "components/page_load_metrics/browser/observers/click_input_tracker.h"
#include "components/page_load_metrics/browser/page_load_metrics_observer.h"
#include "services/metrics/public/cpp/ukm_source.h"
namespace internal {
// NOTE: Some of these histograms are separated into a separate histogram
// specified by the ".Background" suffix. For these events, we put them into the
// background histogram if the web contents was ever in the background from
// navigation start to the event in question.
extern const char kHistogramFirstInputDelay[];
extern const char kHistogramFirstInputTimestamp[];
extern const char kHistogramFirstInputDelay4[];
extern const char kHistogramFirstInputTimestamp4[];
extern const char kHistogramLongestInputDelay[];
extern const char kHistogramLongestInputTimestamp[];
extern const char kHistogramFirstPaint[];
extern const char kHistogramFirstImagePaint[];
extern const char kHistogramDomContentLoaded[];
extern const char kHistogramLoad[];
extern const char kHistogramFirstContentfulPaint[];
extern const char kHistogramFirstMeaningfulPaint[];
extern const char kHistogramLargestContentfulPaint[];
extern const char kHistogramLargestContentfulPaintContentType[];
extern const char kHistogramLargestContentfulPaintMainFrame[];
extern const char kHistogramLargestContentfulPaintMainFrameContentType[];
extern const char kHistogramExperimentalLargestContentfulPaint[];
extern const char kHistogramExperimentalLargestContentfulPaintContentType[];
extern const char kHistogramExperimentalLargestContentfulPaintMainFrame[];
extern const char
kHistogramExperimentalLargestContentfulPaintMainFrameContentType[];
extern const char kHistogramParseDuration[];
extern const char kHistogramParseBlockedOnScriptLoad[];
extern const char kHistogramParseBlockedOnScriptExecution[];
extern const char kHistogramParseStartToFirstMeaningfulPaint[];
extern const char kBackgroundHistogramFirstImagePaint[];
extern const char kBackgroundHistogramDomContentLoaded[];
extern const char kBackgroundHistogramLoad[];
extern const char kBackgroundHistogramFirstPaint[];
extern const char kHistogramLoadTypeFirstContentfulPaintReload[];
extern const char kHistogramLoadTypeFirstContentfulPaintForwardBack[];
extern const char kHistogramLoadTypeFirstContentfulPaintNewNavigation[];
extern const char kHistogramLoadTypeParseStartReload[];
extern const char kHistogramLoadTypeParseStartForwardBack[];
extern const char kHistogramLoadTypeParseStartNewNavigation[];
extern const char kHistogramFailedProvisionalLoad[];
extern const char kHistogramUserGestureNavigationToForwardBack[];
extern const char kHistogramPageTimingForegroundDuration[];
extern const char kHistogramPageTimingForegroundDurationNoCommit[];
extern const char kHistogramForegroundToFirstMeaningfulPaint[];
extern const char kHistogramFirstMeaningfulPaintStatus[];
extern const char kHistogramFirstNonScrollInputAfterFirstPaint[];
extern const char kHistogramFirstScrollInputAfterFirstPaint[];
extern const char kHistogramPageLoadTotalBytes[];
extern const char kHistogramPageLoadNetworkBytes[];
extern const char kHistogramPageLoadCacheBytes[];
extern const char kHistogramPageLoadNetworkBytesIncludingHeaders[];
extern const char kHistogramPageLoadUnfinishedBytes[];
extern const char kHistogramPageLoadCpuTotalUsage[];
extern const char kHistogramPageLoadCpuTotalUsageForegrounded[];
extern const char kHistogramLoadTypeTotalBytesForwardBack[];
extern const char kHistogramLoadTypeNetworkBytesForwardBack[];
extern const char kHistogramLoadTypeCacheBytesForwardBack[];
extern const char kHistogramLoadTypeTotalBytesReload[];
extern const char kHistogramLoadTypeNetworkBytesReload[];
extern const char kHistogramLoadTypeCacheBytesReload[];
extern const char kHistogramLoadTypeTotalBytesNewNavigation[];
extern const char kHistogramLoadTypeNetworkBytesNewNavigation[];
extern const char kHistogramLoadTypeCacheBytesNewNavigation[];
extern const char kHistogramTotalCompletedResources[];
extern const char kHistogramNetworkCompletedResources[];
extern const char kHistogramCacheCompletedResources[];
extern const char kHistogramInputToNavigation[];
extern const char kBackgroundHistogramInputToNavigation[];
extern const char kHistogramInputToNavigationLinkClick[];
extern const char kHistogramInputToNavigationOmnibox[];
extern const char kHistogramInputToFirstPaint[];
extern const char kBackgroundHistogramInputToFirstPaint[];
extern const char kHistogramInputToFirstContentfulPaint[];
extern const char kBackgroundHistogramInputToFirstContentfulPaint[];
extern const char kHistogramBackForwardCacheEvent[];
// Split histograms recorded only when the first rendering cycle has been
// delayed for web font preloading.
// See design doc https://bit.ly/36E8UKB for details.
extern const char kHistogramFontPreloadFirstPaint[];
extern const char kHistogramFontPreloadFirstContentfulPaint[];
extern const char kHistogramFontPreloadLargestContentfulPaint[];
extern const char kHistogramFontPreloadLargestImagePaint[];
extern const char kHistogramFontPreloadLargestTextPaint[];
// Navigation metrics from the navigation start.
extern const char
kHistogramNavigationTimingNavigationStartToFirstRequestStart[];
extern const char
kHistogramNavigationTimingNavigationStartToFirstResponseStart[];
extern const char
kHistogramNavigationTimingNavigationStartToFirstLoaderCallback[];
extern const char
kHistogramNavigationTimingNavigationStartToFinalRequestStart[];
extern const char
kHistogramNavigationTimingNavigationStartToFinalResponseStart[];
extern const char
kHistogramNavigationTimingNavigationStartToFinalLoaderCallback[];
extern const char
kHistogramNavigationTimingNavigationStartToNavigationCommitSent[];
// Navigation metrics between milestones.
extern const char
kHistogramNavigationTimingFirstRequestStartToFirstResponseStart[];
extern const char
kHistogramNavigationTimingFirstResponseStartToFirstLoaderCallback[];
extern const char
kHistogramNavigationTimingFinalRequestStartToFinalResponseStart[];
extern const char
kHistogramNavigationTimingFinalResponseStartToFinalLoaderCallback[];
extern const char
kHistogramNavigationTimingFinalLoaderCallbackToNavigationCommitSent[];
// 103 Early Hints metrics for experiment (https://crbug.com/1093693).
extern const char kHistogramEarlyHintsFirstRequestStartToEarlyHints[];
extern const char kHistogramEarlyHintsFinalRequestStartToEarlyHints[];
extern const char kHistogramEarlyHintsEarlyHintsToFinalResponseStart[];
enum FirstMeaningfulPaintStatus {
FIRST_MEANINGFUL_PAINT_RECORDED,
FIRST_MEANINGFUL_PAINT_BACKGROUNDED,
FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE,
FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP,
FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT,
FIRST_MEANINGFUL_PAINT_LAST_ENTRY
};
// Please keep in sync with PageLoadBackForwardCacheEvent in
// tools/metrics/histograms/enums.xml. These values should not be renumbered.
enum class PageLoadBackForwardCacheEvent {
kEnterBackForwardCache = 0,
kRestoreFromBackForwardCache = 1,
kMaxValue = kRestoreFromBackForwardCache,
};
} // namespace internal
// Observer responsible for recording 'core' page load metrics. Core metrics are
// maintained by loading-dev team, typically the metrics under
// PageLoad.(Document|Paint|Parse)Timing.*.
class CorePageLoadMetricsObserver
: public page_load_metrics::PageLoadMetricsObserver {
public:
CorePageLoadMetricsObserver();
~CorePageLoadMetricsObserver() override;
// page_load_metrics::PageLoadMetricsObserver:
ObservePolicy OnRedirect(
content::NavigationHandle* navigation_handle) override;
ObservePolicy OnCommit(content::NavigationHandle* navigation_handle,
ukm::SourceId source_id) override;
void OnDomContentLoadedEventStart(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnLoadEventStart(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFirstPaintInPage(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFirstImagePaintInPage(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFirstContentfulPaintInPage(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFirstMeaningfulPaintInMainFrameDocument(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFirstInputInPage(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnParseStart(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnParseStop(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnComplete(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnFailedProvisionalLoad(
const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info)
override;
ObservePolicy FlushMetricsOnAppEnterBackground(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnUserInput(
const blink::WebInputEvent& event,
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnResourceDataUseObserved(
content::RenderFrameHost* rfh,
const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>&
resources) override;
void OnCpuTimingUpdate(
content::RenderFrameHost* subframe_rfh,
const page_load_metrics::mojom::CpuTiming& timing) override;
ObservePolicy OnEnterBackForwardCache(
const page_load_metrics::mojom::PageLoadTiming& timing) override;
void OnRestoreFromBackForwardCache(
const page_load_metrics::mojom::PageLoadTiming& timing,
content::NavigationHandle* navigation_handle) override;
void OnLoadingBehaviorObserved(content::RenderFrameHost* rfh,
int behavior_flags) override;
private:
void RecordNavigationTimingHistograms();
void RecordTimingHistograms(
const page_load_metrics::mojom::PageLoadTiming& main_frame_timing);
void RecordByteAndResourceHistograms(
const page_load_metrics::mojom::PageLoadTiming& timing);
void RecordCpuUsageHistograms();
void RecordForegroundDurationHistograms(
const page_load_metrics::mojom::PageLoadTiming& timing,
base::TimeTicks app_background_time);
content::NavigationHandleTiming navigation_handle_timing_;
ui::PageTransition transition_;
bool was_no_store_main_resource_;
// Number of complete resources loaded by the page.
int num_cache_resources_;
int num_network_resources_;
// The number of body (not header) prefilter bytes consumed by completed
// requests for the page.
int64_t cache_bytes_;
int64_t network_bytes_;
// The number of prefilter bytes consumed by completed and partial network
// requests for the page.
int64_t network_bytes_including_headers_;
// The CPU usage attributed to this page.
base::TimeDelta total_cpu_usage_;
base::TimeDelta foreground_cpu_usage_;
// Size of the redirect chain, which excludes the first URL.
int redirect_chain_size_;
// True if we've received a non-scroll input (touch tap or mouse up)
// after first paint has happened.
bool received_non_scroll_input_after_first_paint_ = false;
// True if we've received a scroll input after first paint has happened.
bool received_scroll_input_after_first_paint_ = false;
// True if the first rendering cycle has been delayed due to web font
// preloading.
bool font_preload_started_before_rendering_observed_ = false;
base::TimeTicks first_paint_;
// Tracks user input clicks for possible click burst.
page_load_metrics::ClickInputTracker click_tracker_;
DISALLOW_COPY_AND_ASSIGN(CorePageLoadMetricsObserver);
};
#endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_PAGE_LOAD_METRICS_OBSERVER_H_