Chromium Code Reviews| Index: chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc |
| diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc |
| index 1b52ea8f37126e974d13ff08f527fb609c81d5e5..34221d7f5acbd0fba36a7e2066e32177b7eddaef 100644 |
| --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc |
| +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc |
| @@ -39,15 +39,32 @@ |
| namespace { |
| +void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| + net::HttpCache* cache( |
| + getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); |
| + DCHECK(cache); |
| + std::unique_ptr<net::FailingHttpTransactionFactory> factory( |
| + new net::FailingHttpTransactionFactory(cache->GetSession(), |
|
jkarlin
2017/05/10 18:45:05
base::MakeUnique while we're here :)
Bryan McQuade
2017/05/10 19:14:33
Done
|
| + net::ERR_FAILED)); |
|
jkarlin
2017/05/10 18:45:04
Include the net error header
Bryan McQuade
2017/05/10 19:14:33
Done
|
| + // Throw away old version; since this is a browser test, there is no |
| + // need to restore the old state. |
| + cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory)); |
| +} |
| + |
| // Waits until specified timing and metadata expectations are satisfied. |
| class PageLoadMetricsWaiter |
| : public page_load_metrics::MetricsWebContentsObserver::TestingObserver { |
| public: |
| // A bitvector to express which timing fields to match on. |
| - enum ExpectedTimingFields { |
| - FIRST_PAINT = 1 << 0, |
| - FIRST_CONTENTFUL_PAINT = 1 << 1, |
| - STYLE_UPDATE_BEFORE_FCP = 1 << 2 |
| + enum class ExpectedTimingField : int { |
| + FIRST_LAYOUT = 1 << 0, |
| + FIRST_PAINT = 1 << 1, |
| + FIRST_CONTENTFUL_PAINT = 1 << 2, |
| + FIRST_MEANINGFUL_PAINT = 1 << 3, |
| + STYLE_UPDATE_BEFORE_FCP = 1 << 4, |
| + DOCUMENT_WRITE_BLOCK_RELOAD = 1 << 5, |
| + LOAD_EVENT = 1 << 6 |
| }; |
| explicit PageLoadMetricsWaiter(content::WebContents* web_contents) |
| @@ -56,63 +73,102 @@ class PageLoadMetricsWaiter |
| ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); } |
| // Add the given expectation to match on. |
| - void AddExpectation(ExpectedTimingFields fields) { |
| - matching_fields_ |= fields; |
| + void AddMainFrameExpectation(ExpectedTimingField field) { |
| + main_frame_expected_fields_.set(field); |
| } |
| - |
| - // Instructs observer to also watch for |count| |
| - // WebLoadingBehaviorDocumentWriteBlockReload events. |
| - void ExpectDocumentWriteBlockReload(int count) { |
| - match_document_write_block_reload_ = count; |
| + void AddSubFrameExpectation(ExpectedTimingField field) { |
| + child_frame_expected_fields_.set(field); |
| } |
| // Waits for a TimingUpdated IPC that matches the fields set by |
| - // |AddExpectation|. All matching fields must be set in a TimingUpdated |
| - // IPC for it to end this wait. |
| + // |AddMainFrameExpectation| and |AddSubFrameExpectation|. All matching fields |
| + // must be set in a TimingUpdated IPC for it to end this wait. |
| void Wait() { |
| - if (expectations_satisfied_) |
| + if (expectations_satisfied()) |
| return; |
| run_loop_.reset(new base::RunLoop()); |
| run_loop_->Run(); |
| run_loop_.reset(nullptr); |
| - EXPECT_TRUE(expectations_satisfied_); |
| + EXPECT_TRUE(expectations_satisfied()); |
| } |
| private: |
| + // Manages a bitset of ExpectedTimingFields. |
| + class ExpectedTimingFieldBitSet { |
| + public: |
| + ExpectedTimingFieldBitSet() {} |
| + |
| + // Returns whether this bitset has all bits unset. |
| + bool empty() const { return bitmask_ == 0; } |
|
jkarlin
2017/05/10 18:45:04
Empty
Bryan McQuade
2017/05/10 19:14:32
Done. I interpreted the style guide as indicating
jkarlin
2017/05/11 14:04:05
I mostly agree with you that they could be lowerca
|
| + |
| + // Sets the bit for the given |field|. |
| + void set(ExpectedTimingField field) { bitmask_ |= static_cast<int>(field); } |
|
jkarlin
2017/05/10 18:45:05
Set
Bryan McQuade
2017/05/10 19:14:32
Done
|
| + |
| + // Clears all bits set in the |other| bitset. |
| + void clear(const ExpectedTimingFieldBitSet& other) { |
|
jkarlin
2017/05/10 18:45:04
Typically I think of clear as clearing everything.
Bryan McQuade
2017/05/10 19:14:33
changed to ClearMatching.
|
| + bitmask_ &= ~other.bitmask_; |
| + } |
| + |
| + private: |
| + int bitmask_ = 0; |
| + }; |
| + |
| + static ExpectedTimingFieldBitSet GetMatchedBits( |
| + const page_load_metrics::PageLoadTiming& timing, |
| + const page_load_metrics::PageLoadMetadata& metadata) { |
| + ExpectedTimingFieldBitSet matched_bits; |
| + if (timing.document_timing.first_layout) |
| + matched_bits.set(ExpectedTimingField::FIRST_LAYOUT); |
| + if (timing.document_timing.load_event_start) |
| + matched_bits.set(ExpectedTimingField::LOAD_EVENT); |
| + if (timing.paint_timing.first_paint) |
| + matched_bits.set(ExpectedTimingField::FIRST_PAINT); |
| + if (timing.paint_timing.first_contentful_paint) |
| + matched_bits.set(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| + if (timing.paint_timing.first_meaningful_paint) |
| + matched_bits.set(ExpectedTimingField::FIRST_MEANINGFUL_PAINT); |
| + if (timing.style_sheet_timing.update_style_duration_before_fcp) |
| + matched_bits.set(ExpectedTimingField::STYLE_UPDATE_BEFORE_FCP); |
| + if (metadata.behavior_flags & |
| + blink::WebLoadingBehaviorFlag:: |
| + kWebLoadingBehaviorDocumentWriteBlockReload) |
| + matched_bits.set(ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD); |
| + |
| + return matched_bits; |
| + } |
| + |
| void OnTimingUpdated( |
| + bool is_main_frame, |
| const page_load_metrics::PageLoadTiming& timing, |
| const page_load_metrics::PageLoadMetadata& metadata) override { |
| - if (match_document_write_block_reload_ > 0 && |
| - metadata.behavior_flags & |
| - blink::WebLoadingBehaviorFlag:: |
| - kWebLoadingBehaviorDocumentWriteBlockReload) { |
| - --match_document_write_block_reload_; |
| - } |
| - |
| - if (match_document_write_block_reload_ > 0) { |
| + if (expectations_satisfied()) |
| return; |
| - } |
| - if ((!(matching_fields_ & FIRST_PAINT) || |
| - timing.paint_timing.first_paint) && |
| - (!(matching_fields_ & FIRST_CONTENTFUL_PAINT) || |
| - timing.paint_timing.first_contentful_paint) && |
| - (!(matching_fields_ & STYLE_UPDATE_BEFORE_FCP) || |
| - timing.style_sheet_timing.update_style_duration_before_fcp)) { |
| - expectations_satisfied_ = true; |
| - if (run_loop_) |
| - run_loop_->Quit(); |
| - } |
| + ExpectedTimingFieldBitSet matched_bits = GetMatchedBits(timing, metadata); |
| + if (is_main_frame) |
| + main_frame_expected_fields_.clear(matched_bits); |
| + else |
| + child_frame_expected_fields_.clear(matched_bits); |
| + |
| + if (expectations_satisfied() && run_loop_) |
| + run_loop_->Quit(); |
| + } |
| + |
| + bool expectations_satisfied() const { |
| + return child_frame_expected_fields_.empty() && |
| + main_frame_expected_fields_.empty(); |
| } |
| std::unique_ptr<base::RunLoop> run_loop_; |
| - int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. |
| - bool expectations_satisfied_ = false; |
| - int match_document_write_block_reload_ = 0; |
| + |
| + ExpectedTimingFieldBitSet child_frame_expected_fields_; |
| + ExpectedTimingFieldBitSet main_frame_expected_fields_; |
| }; |
| +using ExpectedTimingField = PageLoadMetricsWaiter::ExpectedTimingField; |
| + |
| } // namespace |
| class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| @@ -121,6 +177,10 @@ class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| ~PageLoadMetricsBrowserTest() override {} |
| protected: |
| + // Force navigation to a new page, so the currently tracked page load runs its |
| + // OnComplete callback. You should prefer to use PageLoadMetricsWaiter, and |
| + // only use NavigateToUntrackedUrl for cases where the waiter isn't |
| + // sufficient. |
| void NavigateToUntrackedUrl() { |
| ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
| } |
| @@ -148,19 +208,6 @@ class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
| DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); |
| }; |
| -void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { |
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| - net::HttpCache* cache( |
| - getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); |
| - DCHECK(cache); |
| - std::unique_ptr<net::FailingHttpTransactionFactory> factory( |
| - new net::FailingHttpTransactionFactory(cache->GetSession(), |
| - net::ERR_FAILED)); |
| - // Throw away old version; since this is a browser test, there is no |
| - // need to restore the old state. |
| - cache->SetHttpNetworkTransactionFactoryForTesting(std::move(factory)); |
| -} |
| - |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); |
| @@ -169,18 +216,25 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoNavigation) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
|
jkarlin
2017/05/10 18:45:05
optional: auto seems reasonable here
Bryan McQuade
2017/05/10 19:14:32
done
|
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_PAINT); |
|
jkarlin
2017/05/10 18:45:04
Seems like it would be useful to have a constructo
Bryan McQuade
2017/05/10 19:14:32
I'm disinclined to do this since we have main and
jkarlin
2017/05/11 14:04:05
Fair point. The constructor could take two values,
|
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| - NavigateToUntrackedUrl(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 1); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramParseDuration, 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramParseBlockedOnScriptLoad, 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramParseBlockedOnScriptExecution, 1); |
| + |
| + // Force navigation to another page, which should force logging of histograms |
| + // persisted at the end of the page load lifetime. |
| + NavigateToUntrackedUrl(); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramPageTimingForegroundDuration, 1); |
| @@ -190,11 +244,38 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { |
| EXPECT_FALSE(NoPageLoadMetricsRecorded()); |
| } |
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPaintForEmptyDocument) { |
| + ASSERT_TRUE(embedded_test_server()->Start()); |
| + |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
|
jkarlin
2017/05/10 18:45:05
What if you could also create a set of unexpected
Bryan McQuade
2017/05/10 19:14:33
Sure, I added an API for this.
|
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| + ui_test_utils::NavigateToURL(browser(), |
| + embedded_test_server()->GetURL("/empty.html")); |
| + waiter->Wait(); |
| + |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 0); |
| +} |
| + |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| + waiter->Wait(); |
| + |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| + |
| + // Perform a same-document navigation. No additional metrics should be logged. |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL("/title1.html#hash")); |
| NavigateToUntrackedUrl(); |
| @@ -207,11 +288,23 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| + waiter->Wait(); |
| + |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramLoad, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); |
| + |
| + waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_LAYOUT); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| - NavigateToUntrackedUrl(); |
| + waiter->Wait(); |
| // We expect one histogram sample for each navigation to title1.html. |
| histogram_tester_.ExpectTotalCount(internal::kHistogramDomContentLoaded, 2); |
| @@ -296,14 +389,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, IgnoreDownloads) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_external_script.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); |
| @@ -312,11 +404,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_no_script.html")); |
| - NavigateToUntrackedUrl(); |
| + waiter->Wait(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| } |
| @@ -324,14 +420,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); |
| histogram_tester_.ExpectTotalCount( |
| @@ -342,14 +439,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_script_block.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| @@ -359,30 +455,40 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| - std::unique_ptr<PageLoadMetricsWaiter> reload_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - reload_waiter->ExpectDocumentWriteBlockReload(2); |
| - |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_script_block.html")); |
| + waiter->Wait(); |
| + |
| + histogram_tester_.ExpectTotalCount( |
| + internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); |
| // Reload should not log the histogram as the script is not blocked. |
| + std::unique_ptr<PageLoadMetricsWaiter> reload_waiter = |
| + CreatePageLoadMetricsWaiter(); |
| + reload_waiter->AddMainFrameExpectation( |
| + ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD); |
| + reload_waiter->AddMainFrameExpectation( |
| + ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_script_block.html")); |
| + reload_waiter->Wait(); |
| + |
| + histogram_tester_.ExpectTotalCount( |
| + internal::kHistogramDocWriteBlockReloadCount, 1); |
| + reload_waiter = CreatePageLoadMetricsWaiter(); |
| + reload_waiter->AddMainFrameExpectation( |
| + ExpectedTimingField::DOCUMENT_WRITE_BLOCK_RELOAD); |
| + reload_waiter->AddMainFrameExpectation( |
| + ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_script_block.html")); |
| - |
| - histogram_tester_.ExpectTotalCount( |
| - internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); |
| - |
| - fcp_waiter->Wait(); |
| reload_waiter->Wait(); |
| histogram_tester_.ExpectTotalCount( |
| @@ -396,11 +502,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| - "/page_load_metrics/document_write_script_async.html")); |
| - NavigateToUntrackedUrl(); |
| + "/page_load_metrics/document_write_async_script.html")); |
| + waiter->Wait(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| @@ -409,11 +519,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_external_script.html")); |
| - NavigateToUntrackedUrl(); |
| + waiter->Wait(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| @@ -422,11 +536,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/document_write_no_script.html")); |
| - NavigateToUntrackedUrl(); |
| + waiter->Wait(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 0); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); |
| @@ -441,9 +559,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> timing_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - timing_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_PAINT); |
| // When an XHTML page contains invalid XML, it causes a paint of the error |
| // message without a layout. Page load metrics currently treats this as an |
| @@ -454,7 +571,7 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { |
| browser(), |
| embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); |
| - timing_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); |
| @@ -488,11 +605,12 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortNewNavigation) { |
| GURL url2(embedded_test_server()->GetURL("/title2.html")); |
| chrome::NavigateParams params2(browser(), url2, |
| ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); |
| - content::TestNavigationManager manager2( |
| - browser()->tab_strip_model()->GetActiveWebContents(), url2); |
| + |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| chrome::Navigate(¶ms2); |
| + waiter->Wait(); |
| - manager2.WaitForNavigationFinished(); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramAbortNewNavigationBeforeCommit, 1); |
| } |
| @@ -509,11 +627,12 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { |
| EXPECT_TRUE(manager.WaitForRequestStart()); |
| chrome::NavigateParams params2(browser(), url, ui::PAGE_TRANSITION_RELOAD); |
| - content::TestNavigationManager manager2( |
| - browser()->tab_strip_model()->GetActiveWebContents(), url); |
| + |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| chrome::Navigate(¶ms2); |
| + waiter->Wait(); |
| - manager2.WaitForNavigationFinished(); |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramAbortReloadBeforeCommit, 1); |
| } |
| @@ -565,15 +684,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortMultiple) { |
| GURL url3(embedded_test_server()->GetURL("/title3.html")); |
| chrome::NavigateParams params3(browser(), url3, ui::PAGE_TRANSITION_TYPED); |
| - content::TestNavigationManager manager3( |
| - browser()->tab_strip_model()->GetActiveWebContents(), url3); |
| + |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| chrome::Navigate(¶ms3); |
| + waiter->Wait(); |
| - EXPECT_TRUE(manager3.WaitForRequestStart()); |
| manager2.WaitForNavigationFinished(); |
| - manager3.WaitForNavigationFinished(); |
| - |
| histogram_tester_.ExpectTotalCount( |
| internal::kHistogramAbortNewNavigationBeforeCommit, 2); |
| } |
| @@ -594,11 +712,15 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| EXPECT_TRUE(manager.WaitForRequestStart()); |
| { |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = |
| + CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| content::TestNavigationManager reload_manager( |
| browser()->tab_strip_model()->GetActiveWebContents(), first_url); |
| EXPECT_TRUE(content::ExecuteScript( |
| browser()->tab_strip_model()->GetActiveWebContents(), |
| "window.location.reload();")); |
| + waiter->Wait(); |
| } |
| manager.WaitForNavigationFinished(); |
| @@ -612,9 +734,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| FirstMeaningfulPaintRecorded) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_MEANINGFUL_PAINT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| + waiter->Wait(); |
| +#if 0 |
| // Wait until the renderer finishes observing layouts. |
| const int kNetworkIdleTime = 3000; |
| const int kMargin = 500; |
| @@ -626,8 +752,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| browser()->tab_strip_model()->GetActiveWebContents(), |
| javascript, &result)); |
| EXPECT_TRUE(result); |
| +#endif |
| - NavigateToUntrackedUrl(); |
| histogram_tester_.ExpectUniqueSample( |
| internal::kHistogramFirstMeaningfulPaintStatus, |
| internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); |
| @@ -641,18 +767,19 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| FirstMeaningfulPaintNotRecorded) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL( |
| browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/page_with_active_connections.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| // Navigate away before a FMP is reported. |
| NavigateToUntrackedUrl(); |
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| + 1); |
| histogram_tester_.ExpectUniqueSample( |
| internal::kHistogramFirstMeaningfulPaintStatus, |
| internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); |
| @@ -666,14 +793,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| NoStatePrefetchObserverCacheable) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/title1.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount( |
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); |
| @@ -685,14 +811,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| NoStatePrefetchObserverNoStore) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::FIRST_CONTENTFUL_PAINT); |
| ui_test_utils::NavigateToURL(browser(), |
| embedded_test_server()->GetURL("/nostore.html")); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount( |
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); |
| @@ -703,9 +828,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| - std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter = |
| - CreatePageLoadMetricsWaiter(); |
| - fcp_waiter->AddExpectation(PageLoadMetricsWaiter::STYLE_UPDATE_BEFORE_FCP); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::STYLE_UPDATE_BEFORE_FCP); |
| // Careful: Blink code clamps timestamps to 5us, so any CSS parsing we do here |
| // must take >> 5us, otherwise we'll log 0 for the value and it will remain |
| @@ -713,8 +837,7 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { |
| ui_test_utils::NavigateToURL( |
| browser(), |
| embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html")); |
| - NavigateToUntrackedUrl(); |
| - fcp_waiter->Wait(); |
| + waiter->Wait(); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, |
| 1); |
| @@ -729,8 +852,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { |
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) { |
| ASSERT_TRUE(embedded_test_server()->Start()); |
| + std::unique_ptr<PageLoadMetricsWaiter> waiter = CreatePageLoadMetricsWaiter(); |
| + waiter->AddMainFrameExpectation(ExpectedTimingField::LOAD_EVENT); |
| ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |
| "/page_load_metrics/large.html")); |
| + waiter->Wait(); |
| + |
| + // Payload histograms are only logged when a page load terminates, so force |
| + // navigation to another page. |
| NavigateToUntrackedUrl(); |
| histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |