Chromium Code Reviews| Index: chrome/browser/prerender/prerender_browsertest.cc |
| diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
| index 9956202fd38c3e2a1faba9a100a6c2a5ea7114da..86cc1215797a6d505173d7114194b645d5bed4af 100644 |
| --- a/chrome/browser/prerender/prerender_browsertest.cc |
| +++ b/chrome/browser/prerender/prerender_browsertest.cc |
| @@ -26,6 +26,7 @@ |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/test/scoped_feature_list.h" |
| +#include "base/test/simple_test_tick_clock.h" |
| #include "base/test/test_timeouts.h" |
| #include "base/values.h" |
| #include "build/build_config.h" |
| @@ -40,6 +41,8 @@ |
| #include "chrome/browser/extensions/extension_apitest.h" |
| #include "chrome/browser/external_protocol/external_protocol_handler.h" |
| #include "chrome/browser/net/prediction_options.h" |
| +#include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h" |
| +#include "chrome/browser/page_load_metrics/observers/prerender_page_load_metrics_observer.h" |
| #include "chrome/browser/password_manager/password_store_factory.h" |
| #include "chrome/browser/predictors/autocomplete_action_predictor.h" |
| #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" |
| @@ -50,6 +53,7 @@ |
| #include "chrome/browser/prerender/prerender_link_manager_factory.h" |
| #include "chrome/browser/prerender/prerender_manager.h" |
| #include "chrome/browser/prerender/prerender_manager_factory.h" |
| +#include "chrome/browser/prerender/prerender_tab_helper.h" |
| #include "chrome/browser/prerender/prerender_test_utils.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_io_data.h" |
| @@ -534,6 +538,16 @@ base::FilePath GetTestPath(const std::string& file_name) { |
| base::FilePath().AppendASCII(file_name)); |
| } |
| +page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( |
| + const GURL& dest_url) { |
| + return page_load_metrics::PageLoadExtraInfo( |
| + base::TimeDelta(), base::TimeDelta(), false, |
| + page_load_metrics::UserInitiatedInfo::BrowserInitiated(), dest_url, |
| + dest_url, page_load_metrics::ABORT_NONE, |
| + page_load_metrics::UserInitiatedInfo::NotUserInitiated(), |
| + base::TimeDelta(), 0, 0, page_load_metrics::PageLoadMetadata()); |
| +} |
| + |
| } // namespace |
| class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
| @@ -721,6 +735,8 @@ class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
| call_javascript_ = false; |
| } |
| + void EnableJavascriptCalls() { call_javascript_ = true; } |
| + |
| void DisableLoadEventCheck() { |
| check_load_events_ = false; |
| } |
| @@ -875,6 +891,26 @@ class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
| base::ASCIIToUTF16(javascript)); |
| } |
| + base::SimpleTestTickClock* OverridePrerenderManagerTimeTicks() { |
| + auto clock = base::MakeUnique<base::SimpleTestTickClock>(); |
| + auto clock_ptr = clock.get(); |
| + // The default zero time causes the prerender manager to do strange things. |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + GetPrerenderManager()->SetTickClockForTesting(std::move(clock)); |
| + return clock_ptr; |
| + } |
| + |
| + void SetMidLoadClockAdvance(base::SimpleTestTickClock* clock, |
|
pasko
2016/12/20 19:33:34
This is used only in one test, which is not a good
mattcary
2016/12/21 17:08:58
This is a text fixture only used in this file (ie,
pasko
2016/12/21 18:39:08
Yes, but the class is also about 500 lines of code
mattcary
2016/12/22 10:49:07
yes, exactly, hence the test name.
It seems that
|
| + base::TimeDelta delta) { |
| + mid_load_clock_ = clock; |
| + mid_load_clock_tick_advance_ = delta; |
| + } |
| + |
| + void ClearMidLoadClock() { |
| + mid_load_clock_tick_advance_ = base::TimeDelta(); |
| + mid_load_clock_ = nullptr; |
| + } |
| + |
| private: |
| // TODO(davidben): Remove this altogether so the tests don't globally assume |
| // only one prerender. |
| @@ -899,6 +935,11 @@ class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
| NavigateWithPrerenders(loader_url, expected_final_status_queue); |
| prerenders[0]->WaitForLoads(expected_number_of_loads); |
| + if (!mid_load_clock_tick_advance_.is_zero()) { |
| + EXPECT_TRUE(mid_load_clock_); |
| + mid_load_clock_->Advance(mid_load_clock_tick_advance_); |
| + } |
| + |
| FinalStatus expected_final_status = expected_final_status_queue.front(); |
| if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { |
| // The prerender will abort on its own. Assert it does so correctly. |
| @@ -991,12 +1032,17 @@ class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
| std::string loader_path_; |
| std::string loader_query_; |
| base::test::ScopedFeatureList feature_list_; |
| + base::TimeDelta mid_load_clock_tick_advance_; |
| + base::SimpleTestTickClock* mid_load_clock_; |
| }; |
| // Checks that a page is correctly prerendered in the case of a |
| // <link rel=prerender> tag and then loaded into a tab in response to a |
| // navigation. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
| + test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = |
| + test_utils::FirstContentfulPaintManagerWaiter::Create( |
| + GetPrerenderManager()); |
| PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); |
| histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); |
| @@ -1011,18 +1057,58 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
| GetActiveWebContents()->GetRenderProcessHost()); |
| NavigateToDestURL(); |
| channel_close_watcher.WaitForChannelClose(); |
| + fcp_waiter->Wait(); |
| histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); |
| histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", |
| 1); |
| histogram_tester().ExpectTotalCount( |
| "Prerender.websame_PerceivedPLTMatchedComplete", 1); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PerceivedTTFCPRecorded.Visible", 1); |
| ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
| } |
| +// Checks that the correct page load metrics observers are produced with and |
| +// without a prerender. |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PageLoadMetrics) { |
| + // Simple load. The prefetch page is used as a simple page with a nonempty |
| + // layout; no prefetching is performed. |
| + test_utils::FirstContentfulPaintManagerWaiter* simple_fcp_waiter = |
| + test_utils::FirstContentfulPaintManagerWaiter::Create( |
| + GetPrerenderManager()); |
| + ui_test_utils::NavigateToURL( |
| + current_browser(), src_server()->GetURL("/prerender/prefetch_page.html")); |
| + simple_fcp_waiter->Wait(); |
| + |
| + // Prerendered load. |
|
pasko
2016/12/20 19:33:34
The Simple/Prerender tests have little in common,
mattcary
2016/12/21 17:08:58
Done.
|
| + test_utils::FirstContentfulPaintManagerWaiter* prerender_fcp_waiter = |
| + test_utils::FirstContentfulPaintManagerWaiter::Create( |
| + GetPrerenderManager()); |
| + PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| + NavigateToDestURL(); |
| + prerender_fcp_waiter->Wait(); |
| + |
| + // Histogram only emitted during the simple load. |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); |
| + // Histogram only emitted during prerender. |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + // Histogram only emitted during the two simple loads: the NavigateToURL call, |
| + // and the page containing the link rel=prerender. |
| + histogram_tester().ExpectTotalCount( |
| + "PageLoad.DocumentTiming.NavigationToFirstLayout", 2); |
| +} |
| + |
| // Checks that cross-domain prerenders emit the correct histograms. |
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { |
| + test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = |
| + test_utils::FirstContentfulPaintManagerWaiter::Create( |
| + GetPrerenderManager()); |
| PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), |
| FINAL_STATUS_USED, 1); |
| histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); |
| @@ -1033,11 +1119,15 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { |
| "Prerender.webcross_PrerenderNotSwappedInPLT", 1); |
| NavigateToDestURL(); |
| + fcp_waiter->Wait(); |
| + |
| histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); |
| histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", |
| 1); |
| histogram_tester().ExpectTotalCount( |
| "Prerender.webcross_PerceivedPLTMatchedComplete", 1); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| } |
| // Checks that pending prerenders launch and receive proper event treatment. |
| @@ -3184,6 +3274,276 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, AutosigninInPrerenderer) { |
| EXPECT_EQ(0, done_counter.count()); |
| } |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| + |
| + base::TimeTicks load_start = clock->NowTicks(); |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURL(); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(load_start); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
|
pasko
2016/12/21 18:39:08
this number does not contribute to any of the expe
mattcary
2016/12/22 10:49:07
Actually, it's just to initialize it to a non-null
|
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + |
| + GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
| + DisableJavascriptCalls(); |
|
pasko
2016/12/20 19:33:34
We are not expecting swap to succeed on this prere
mattcary
2016/12/21 17:08:58
Done, here and below. It's not the swap bit, it's
|
| + PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); |
| + |
| + // This prerender cancels and reuses the first. |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + base::TimeTicks load_start = clock->NowTicks(); |
| + EnableJavascriptCalls(); |
| + PrerenderTestURL(url, FINAL_STATUS_USED, 1); |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + |
| + NavigateToDestURL(); |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(load_start); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + // If the first prerender had been used, the perceived TTFCP would have been |
| + // under a second: 2362ms - 2 sec worth of Advance(). |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + FirstContentfulPaintTimingTimeout) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + |
| + // Make the first prerender time out. |
| + base::TimeDelta time_out_delta = |
| + GetPrerenderManager()->config().time_to_live + |
| + base::TimeDelta::FromSeconds(10); |
| + SetMidLoadClockAdvance(clock, time_out_delta); |
| + |
| + GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
| + PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1); |
| + |
| + ClearMidLoadClock(); |
| + base::TimeTicks load_start = clock->NowTicks(); |
| + PrerenderTestURL(url, FINAL_STATUS_USED, 1); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURL(); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(load_start); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
|
pasko
2016/12/21 18:39:08
this part seems to repeat what the previous test d
mattcary
2016/12/22 10:49:07
Yes. The point is that parts of the page load timi
|
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + // If the timed out had been used, the perceived TTFCP would have been |
| + // negative. |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + FirstContentfulPaintTimingNoCommit) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + |
| + GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
| + base::FilePath url_file = ui_test_utils::GetTestFilePath( |
| + base::FilePath(), |
| + base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
| + |
| + base::RunLoop prerender_start_loop; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, |
| + prerender_start_loop.QuitClosure())); |
| + DisableJavascriptCalls(); |
| + PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
| + prerender_start_loop.Run(); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(clock->NowTicks()); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Visible", 0); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.none_PerceivedTTFCPRecorded.Visible", 1); |
| + |
| + // Check that the prerender didn't happen with a defined origin. |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 0); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0); |
| + |
| + // A FCP is fired by the observer, but the manager should detect that the |
| + // perceived time is not set and so update the following histogram. |
|
pasko
2016/12/21 18:39:09
I was confused by this comment. The notion of perc
mattcary
2016/12/22 10:49:07
Done.
|
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + FirstContentfulPaintTimingTwoPages) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + |
| + DisableJavascriptCalls(); |
| + // First prerender a different page from the usual target. |
| + PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + base::TimeTicks load_start = clock->NowTicks(); |
| + EnableJavascriptCalls(); |
| + PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURL(); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(load_start); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + // The FCP time should end up on the edge of the bucket. |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + base::TimeTicks load_start = clock->NowTicks(); |
| + PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURL(); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(load_start); |
| + |
| + EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING, |
| + observer.OnHidden(page_load_metrics::PageLoadTiming(), |
| + GenericPageLoadExtraInfo(dest_url()))); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1); |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1654, 1); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| + FirstContentfulPaintHiddenNoCommit) { |
| + GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
| + base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
| + |
| + GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
| + base::FilePath url_file = ui_test_utils::GetTestFilePath( |
| + base::FilePath(), |
| + base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
| + |
| + base::RunLoop prerender_start_loop; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, |
| + prerender_start_loop.QuitClosure())); |
| + DisableJavascriptCalls(); |
| + PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
| + prerender_start_loop.Run(); |
| + |
| + clock->Advance(base::TimeDelta::FromSeconds(1)); |
| + NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
| + |
| + test_utils::TestPrerenderPageLoadMetricsObserver observer( |
| + GetPrerenderManager(), GetActiveWebContents()); |
| + observer.SetNavigationStartTo(clock->NowTicks()); |
| + |
| + EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING, |
| + observer.OnHidden(page_load_metrics::PageLoadTiming(), |
| + GenericPageLoadExtraInfo(dest_url()))); |
| + |
| + page_load_metrics::PageLoadTiming timing; |
| + timing.navigation_start = base::Time::FromDoubleT(1); |
| + timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362); |
| + page_load_metrics::PageLoadMetricsObserverTestHarness:: |
| + PopulateRequiredTimingFields(&timing); |
| + observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url())); |
| + |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Hidden", 0); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1); |
| + |
| + // Check that the prerender didn't happen with a defined origin. |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 0); |
| + histogram_tester().ExpectTotalCount( |
| + "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0); |
| + |
| + // A FCP is fired by the observer, but the manager should detect that the |
| + // perceived time is not set and so update the following histogram. |
| + histogram_tester().ExpectUniqueSample( |
| + "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1); |
| +} |
| + |
| class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { |
| public: |
| void SetUpOnMainThread() override { |