| 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 8d69c71e8ddf51c0cebb4c566fda09100271e219..2e54df31d741d14370389f4d6555a932de1fbe4d 100644
|
| --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
|
| +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
|
| @@ -38,9 +38,9 @@
|
|
|
| namespace {
|
|
|
| -// Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received
|
| -// matching a PageLoadTiming. See WaitForMatchingIPC for details.
|
| -class TimingUpdatedObserver : public content::BrowserMessageFilter {
|
| +// 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 {
|
| @@ -49,57 +49,40 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter {
|
| STYLE_UPDATE_BEFORE_FCP = 1 << 2
|
| };
|
|
|
| - explicit TimingUpdatedObserver(content::RenderWidgetHost* render_widget_host)
|
| - : content::BrowserMessageFilter(PageLoadMetricsMsgStart) {
|
| - render_widget_host->GetProcess()->AddFilter(this);
|
| + explicit PageLoadMetricsWaiter(content::WebContents* web_contents)
|
| + : TestingObserver(web_contents) {}
|
|
|
| - // Roundtrip to the IO thread, to ensure that the filter is properly
|
| - // installed.
|
| - content::BrowserThread::PostTaskAndReply(
|
| - content::BrowserThread::IO, FROM_HERE, base::BindOnce(&base::DoNothing),
|
| - base::BindOnce(&TimingUpdatedObserver::Quit, this));
|
| - run_loop_.reset(new base::RunLoop());
|
| - run_loop_->Run();
|
| - run_loop_.reset(nullptr);
|
| - }
|
| + ~PageLoadMetricsWaiter() override { DCHECK_EQ(nullptr, run_loop_.get()); }
|
|
|
| - // Add the given timing fields to the set of fields to match on.
|
| - void AddMatchingFields(ExpectedTimingFields fields) {
|
| + // Add the given expectation to match on.
|
| + void AddExpectation(ExpectedTimingFields fields) {
|
| matching_fields_ |= fields;
|
| }
|
|
|
| // Instructs observer to also watch for |count|
|
| // WebLoadingBehaviorDocumentWriteBlockReload events.
|
| - void MatchDocumentWriteBlockReload(int count) {
|
| + void ExpectDocumentWriteBlockReload(int count) {
|
| match_document_write_block_reload_ = count;
|
| }
|
|
|
| // Waits for a TimingUpdated IPC that matches the fields set by
|
| - // |AddMatchingFields|. All matching fields must be set in a TimingUpdated
|
| + // |AddExpectation|. All matching fields must be set in a TimingUpdated
|
| // IPC for it to end this wait.
|
| - void WaitForMatchingIPC() {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - if (matched_timing_update_)
|
| + void Wait() {
|
| + if (expectations_satisfied_)
|
| return;
|
|
|
| run_loop_.reset(new base::RunLoop());
|
| run_loop_->Run();
|
| run_loop_.reset(nullptr);
|
| - }
|
|
|
| - private:
|
| - bool OnMessageReceived(const IPC::Message& message) override {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - IPC_BEGIN_MESSAGE_MAP(TimingUpdatedObserver, message)
|
| - IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated)
|
| - IPC_END_MESSAGE_MAP()
|
| -
|
| - return false;
|
| + EXPECT_TRUE(expectations_satisfied_);
|
| }
|
|
|
| - bool OnTimingUpdated(const page_load_metrics::PageLoadTiming& timing,
|
| - const page_load_metrics::PageLoadMetadata& metadata) {
|
| + private:
|
| + void OnTimingUpdated(
|
| + 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::
|
| @@ -108,7 +91,7 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter {
|
| }
|
|
|
| if (match_document_write_block_reload_ > 0) {
|
| - return true;
|
| + return;
|
| }
|
|
|
| if ((!(matching_fields_ & FIRST_PAINT) ||
|
| @@ -117,41 +100,15 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter {
|
| timing.paint_timing.first_contentful_paint) &&
|
| (!(matching_fields_ & STYLE_UPDATE_BEFORE_FCP) ||
|
| timing.style_sheet_timing.update_style_duration_before_fcp)) {
|
| - // Ensure that any other handlers of this message, for example the real
|
| - // PageLoadMetric observers, get a chance to handle this message before
|
| - // this waiter unblocks.
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::IO, FROM_HERE,
|
| - base::BindOnce(&TimingUpdatedObserver::BounceTimingUpdate, this,
|
| - timing, metadata));
|
| + expectations_satisfied_ = true;
|
| + if (run_loop_)
|
| + run_loop_->Quit();
|
| }
|
| - return true;
|
| - }
|
| -
|
| - void BounceTimingUpdate(const page_load_metrics::PageLoadTiming& timing,
|
| - const page_load_metrics::PageLoadMetadata& metadata) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI, FROM_HERE,
|
| - base::BindOnce(&TimingUpdatedObserver::SetTimingUpdatedAndQuit, this));
|
| - }
|
| -
|
| - void Quit() {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - if (run_loop_)
|
| - run_loop_->Quit();
|
| - }
|
| -
|
| - void SetTimingUpdatedAndQuit() {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - matched_timing_update_ = true;
|
| - Quit();
|
| }
|
|
|
| - ~TimingUpdatedObserver() override {}
|
| -
|
| std::unique_ptr<base::RunLoop> run_loop_;
|
| int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields.
|
| - bool matched_timing_update_ = false;
|
| + bool expectations_satisfied_ = false;
|
| int match_document_write_block_reload_ = 0;
|
| };
|
|
|
| @@ -178,12 +135,10 @@ class PageLoadMetricsBrowserTest : public InProcessBrowserTest {
|
| return total_pageload_histograms - total_internal_histograms == 0;
|
| }
|
|
|
| - scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() {
|
| + std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter() {
|
| content::WebContents* web_contents =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver(
|
| - web_contents->GetRenderViewHost()->GetWidget()));
|
| - return observer;
|
| + return base::MakeUnique<PageLoadMetricsWaiter>(web_contents);
|
| }
|
|
|
| base::HistogramTester histogram_tester_;
|
| @@ -339,15 +294,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, IgnoreDownloads) {
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL(
|
| "/page_load_metrics/document_write_external_script.html"));
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1);
|
| @@ -368,14 +322,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) {
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(browser(),
|
| embedded_test_server()->GetURL("/title1.html"));
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0);
|
| @@ -387,15 +340,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) {
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL(
|
| "/page_load_metrics/document_write_script_block.html"));
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
|
| @@ -405,13 +357,12 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) {
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| - scoped_refptr<TimingUpdatedObserver> reload_observer =
|
| - CreateTimingUpdatedObserver();
|
| - reload_observer->MatchDocumentWriteBlockReload(2);
|
| + 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);
|
|
|
| ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL(
|
| @@ -429,8 +380,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) {
|
| histogram_tester_.ExpectTotalCount(
|
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
|
|
|
| - fcp_observer->WaitForMatchingIPC();
|
| - reload_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
| + reload_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1);
|
| @@ -488,9 +439,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) {
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> timing_observer =
|
| - CreateTimingUpdatedObserver();
|
| - timing_observer->AddMatchingFields(TimingUpdatedObserver::FIRST_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> timing_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + timing_waiter->AddExpectation(PageLoadMetricsWaiter::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
|
| @@ -501,7 +452,7 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) {
|
| browser(),
|
| embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml"));
|
|
|
| - timing_observer->WaitForMatchingIPC();
|
| + timing_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0);
|
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0);
|
| @@ -688,15 +639,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
|
| FirstMeaningfulPaintNotRecorded) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL(
|
| "/page_load_metrics/page_with_active_connections.html"));
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| // Navigate away before a FMP is reported.
|
| NavigateToUntrackedUrl();
|
| @@ -714,15 +664,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
|
| NoStatePrefetchObserverCacheable) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(browser(),
|
| embedded_test_server()->GetURL("/title1.html"));
|
|
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0);
|
| @@ -734,15 +683,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
|
| NoStatePrefetchObserverNoStore) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::FIRST_CONTENTFUL_PAINT);
|
|
|
| ui_test_utils::NavigateToURL(browser(),
|
| embedded_test_server()->GetURL("/nostore.html"));
|
|
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(
|
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1);
|
| @@ -753,10 +701,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
|
| IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
|
|
| - scoped_refptr<TimingUpdatedObserver> fcp_observer =
|
| - CreateTimingUpdatedObserver();
|
| - fcp_observer->AddMatchingFields(
|
| - TimingUpdatedObserver::STYLE_UPDATE_BEFORE_FCP);
|
| + std::unique_ptr<PageLoadMetricsWaiter> fcp_waiter =
|
| + CreatePageLoadMetricsWaiter();
|
| + fcp_waiter->AddExpectation(PageLoadMetricsWaiter::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
|
| @@ -765,7 +712,7 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) {
|
| browser(),
|
| embedded_test_server()->GetURL("/page_load_metrics/page_with_css.html"));
|
| NavigateToUntrackedUrl();
|
| - fcp_observer->WaitForMatchingIPC();
|
| + fcp_waiter->Wait();
|
|
|
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint,
|
| 1);
|
|
|