Skip to content

Commit

Permalink
[Merge to M110] Prerender: Record events on PrerenderPageLoadMetricsO…
Browse files Browse the repository at this point in the history
…bserver in UMA

This UMA is used for debugging the issue. From this UMA, it's expected
that we understand...

- whether prerender page load events are notified to the observer, and
- whether the events are ignored as the prerendered page gets
  backgrounded.

Intentionally this UMA doesn't record observer events per trigger type
(e.g., SpeculationRules) because some functions can be called before
PrerenderPageLoadMetricsObserver::trigger_type_ is set (e.g., when
OnComplete() called from the destructor of PageLoadTracker before
prerender activation).

(cherry picked from commit 1ea2057)

Bug: 1379491
Change-Id: Ibecacc386142397a8dd9ddc298b9adccaa80cc63
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4194898
Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
Reviewed-by: Asami Doi <asamidoi@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1097400}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4206627
Commit-Queue: Takashi Toyoshima <toyoshim@chromium.org>
Auto-Submit: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/branch-heads/5481@{#811}
Cr-Branched-From: 130f3e4-refs/heads/main@{#1084008}
  • Loading branch information
nhiroki authored and Chromium LUCI CQ committed Jan 31, 2023
1 parent b64fa13 commit 8a0ff9b
Show file tree
Hide file tree
Showing 5 changed files with 241 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ class PrerenderPageLoadMetricsObserverBrowserTest

protected:
void CheckResponsivenessMetrics(const GURL& url) {
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::
kRecordNormalizedResponsivenessMetrics,
1);

std::vector<std::string> ukm_list = {
"InteractiveTiming.WorstUserInteractionLatency.MaxEventDuration",
"InteractiveTiming.AverageUserInteractionLatencyOverBudget."
Expand Down Expand Up @@ -125,6 +131,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
GURL prerender_url = embedded_test_server()->GetURL("/title2.html");
prerender_helper_.AddPrerender(prerender_url);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

// Activate and wait for FCP.
auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>(
web_contents());
Expand All @@ -133,18 +143,30 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
prerender_helper_.NavigatePrimaryPage(prerender_url);
waiter->Wait();

// Expect only FP and FCP for prerender are recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kDidActivatePrerenderedPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderNavigationToActivation,
content::PrerenderTriggerType::kSpeculationRule, ""),
1);

// Expect only FP and FCP for prerender are recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstPaintInPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToFirstPaint,
content::PrerenderTriggerType::kSpeculationRule, ""),
1);
histogram_tester().ExpectTotalCount(internal::kHistogramFirstPaint, 0);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstContentfulPaintInPage,
1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToFirstContentfulPaint,
Expand All @@ -161,6 +183,9 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
waiter->Wait();

// Expect only FID for prerender is recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstInputInPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderFirstInputDelay4,
Expand All @@ -174,6 +199,12 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

// Expect only LCP for prerender is recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToLargestContentfulPaint2,
Expand All @@ -182,6 +213,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
histogram_tester().ExpectTotalCount(
internal::kHistogramLargestContentfulPaint, 0);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordLayoutShiftScoreMetrics,
1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderCumulativeShiftScore,
Expand Down Expand Up @@ -270,6 +305,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
GURL prerender_url = embedded_test_server()->GetURL("/title2.html");
prerender_helper_.AddPrerender(prerender_url);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

// Start an activation.
prerender_helper_.NavigatePrimaryPage(prerender_url);

Expand All @@ -283,6 +322,13 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);

auto entries = GetMergedUkmEntries(PrerenderPageLoad::kEntryName);
EXPECT_EQ(2u, entries.size());

Expand Down Expand Up @@ -335,6 +381,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
int host_id = prerender_helper_.GetHostForUrl(prerender_url);
EXPECT_NE(host_id, content::RenderFrameHost::kNoFrameTreeNodeId);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

// Activate and wait for FCP.
auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>(
web_contents());
Expand All @@ -348,20 +398,32 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
/*is_renderer_initiated=*/false));
waiter->Wait();

// Expect only FP and FCP for prerender are recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kDidActivatePrerenderedPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderNavigationToActivation,
content::PrerenderTriggerType::kEmbedder,
prerender_utils::kDirectUrlInputMetricSuffix),
1);

// Expect only FP and FCP for prerender are recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstPaintInPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToFirstPaint,
content::PrerenderTriggerType::kEmbedder,
prerender_utils::kDirectUrlInputMetricSuffix),
1);
histogram_tester().ExpectTotalCount(internal::kHistogramFirstPaint, 0);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstContentfulPaintInPage,
1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToFirstContentfulPaint,
Expand All @@ -379,6 +441,9 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
waiter->Wait();

// Expect only FID for prerender is recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstInputInPage, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderFirstInputDelay4,
Expand All @@ -393,6 +458,12 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

// Expect only LCP for prerender is recorded.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderActivationToLargestContentfulPaint2,
Expand All @@ -402,6 +473,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
histogram_tester().ExpectTotalCount(
internal::kHistogramLargestContentfulPaint, 0);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordLayoutShiftScoreMetrics,
1);
histogram_tester().ExpectTotalCount(
prerender_helper_.GenerateHistogramName(
internal::kHistogramPrerenderCumulativeShiftScore,
Expand Down Expand Up @@ -437,6 +512,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
GURL prerender_url = embedded_test_server()->GetURL("/title2.html");
const int host_id = prerender_helper_.AddPrerender(prerender_url);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

content::test::PrerenderHostObserver observer(*web_contents(), host_id);
prerender_helper_.CancelPrerenderedPage(host_id);
observer.WaitForDestroyed();
Expand All @@ -446,6 +525,23 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kDidActivatePrerenderedPage, 0);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstPaintInPage, 0);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstContentfulPaintInPage,
0);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);

// As the prerender was cancelled, no prerendering metrics are recorded.
EXPECT_EQ(0u, histogram_tester()
.GetTotalCountsForPrefix("PageLoad.Clients.Prerender.")
Expand Down Expand Up @@ -475,6 +571,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
redirected_url.spec());
prerender_helper_.AddPrerender(prerender_url);

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

// Activate and wait for FCP.
auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>(
web_contents());
Expand All @@ -483,12 +583,30 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
prerender_helper_.NavigatePrimaryPage(prerender_url);
waiter->Wait();

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kDidActivatePrerenderedPage, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstPaintInPage, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstContentfulPaintInPage,
1);

// Force navigation to another page, which should force logging of histograms
// persisted at the end of the page load lifetime.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

// Verify that UKM records the URL after the redirection.
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);

// Verify that UKM records the URL after the redirection, not the initial URL.
auto entries = GetMergedUkmEntries(PrerenderPageLoad::kEntryName);
ASSERT_FALSE(base::Contains(entries, prerender_url));
const ukm::mojom::UkmEntry* prerendered_page_entry =
Expand Down Expand Up @@ -535,6 +653,10 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
registry_observer.WaitForTrigger(kPrerenderingUrl);
}

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnPrerenderStart, 1);

int host_id = prerender_helper_.GetHostForUrl(kPrerenderingUrl);
content::test::PrerenderHostObserver prerender_observer(*web_contents(),
host_id);
Expand All @@ -551,14 +673,38 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
main_document_response.WaitForRequest();
main_document_response.Send(kResponseWithNoStore);
main_document_response.Done();

auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>(
web_contents());
waiter->AddPageExpectation(page_load_metrics::PageLoadMetricsTestWaiter::
TimingField::kFirstContentfulPaint);
primary_page_manager.WaitForNavigationFinished();
prerender_observer.WaitForActivation();
waiter->Wait();

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kDidActivatePrerenderedPage, 1);

// Force navigation to another page, which should force logging of metrics
// persisted at the end of the page load lifetime.
ASSERT_TRUE(
ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)));

histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstPaintInPage, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnFirstContentfulPaintInPage,
1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kOnComplete, 1);
histogram_tester().ExpectBucketCount(
internal::kPageLoadPrerenderObserverEvent,
internal::PageLoadPrerenderObserverEvent::kRecordSessionEndHistograms, 1);

auto entries = GetMergedUkmEntries(PrerenderPageLoad::kEntryName);
EXPECT_EQ(2u, entries.size());

Expand All @@ -574,4 +720,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderPageLoadMetricsObserverBrowserTest,
ukm_recorder().ExpectEntryMetric(
prerendered_page_entry,
PrerenderPageLoad::kMainFrameResource_RequestHasNoStoreName, 1);

EXPECT_TRUE(ukm_recorder().EntryHasMetric(
prerendered_page_entry,
PrerenderPageLoad::kTiming_ActivationToLargestContentfulPaintName));
}

0 comments on commit 8a0ff9b

Please sign in to comment.