 Chromium Code Reviews
 Chromium Code Reviews Issue 2823523003:
  [Page Load Metrics] PageLoadMetrics Mojofication.  (Closed)
    
  
    Issue 2823523003:
  [Page Load Metrics] PageLoadMetrics Mojofication.  (Closed) 
  | Index: chrome/browser/page_load_metrics/page_load_metrics_mojofication_browsertest.cc | 
| diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_mojofication_browsertest.cc | 
| similarity index 66% | 
| copy from chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc | 
| copy to chrome/browser/page_load_metrics/page_load_metrics_mojofication_browsertest.cc | 
| index 8d69c71e8ddf51c0cebb4c566fda09100271e219..aef526fea94b17ac0de2f1ca3cf17c9b6c4a64a6 100644 | 
| --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc | 
| +++ b/chrome/browser/page_load_metrics/page_load_metrics_mojofication_browsertest.cc | 
| @@ -5,6 +5,7 @@ | 
| #include "base/files/scoped_temp_dir.h" | 
| #include "base/macros.h" | 
| #include "base/test/histogram_tester.h" | 
| +#include "base/test/scoped_feature_list.h" | 
| #include "base/time/time.h" | 
| #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 
| #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.h" | 
| @@ -18,7 +19,7 @@ | 
| #include "chrome/browser/ui/browser.h" | 
| #include "chrome/browser/ui/browser_navigator_params.h" | 
| #include "chrome/browser/ui/tabs/tab_strip_model.h" | 
| -#include "chrome/common/page_load_metrics/page_load_metrics_messages.h" | 
| +#include "chrome/common/chrome_features.h" | 
| #include "chrome/common/pref_names.h" | 
| #include "chrome/common/url_constants.h" | 
| #include "chrome/test/base/in_process_browser_test.h" | 
| @@ -29,18 +30,34 @@ | 
| #include "content/public/browser/render_view_host.h" | 
| #include "content/public/test/browser_test_utils.h" | 
| #include "content/public/test/download_test_observer.h" | 
| +#include "content/public/test/web_contents_binding_set_test_binder.h" | 
| +#include "mojo/public/cpp/bindings/associated_binding.h" | 
| #include "net/http/failing_http_transaction_factory.h" | 
| #include "net/http/http_cache.h" | 
| #include "net/test/embedded_test_server/embedded_test_server.h" | 
| #include "net/test/url_request/url_request_failed_job.h" | 
| #include "net/url_request/url_request_context.h" | 
| #include "net/url_request/url_request_context_getter.h" | 
| +#include "testing/gmock/include/gmock/gmock.h" | 
| namespace { | 
| -// Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received | 
| -// matching a PageLoadTiming. See WaitForMatchingIPC for details. | 
| -class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| +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)); | 
| +} | 
| + | 
| +// Wait until we dispatch PageLoadTiming through UpdateTiming. | 
| +// matching a PageLoadTiming. See WaitForTimingUpdated for details. | 
| +class PageLoadTimingObserver { | 
| public: | 
| // A bitvector to express which timing fields to match on. | 
| enum ExpectedTimingFields { | 
| @@ -49,20 +66,19 @@ 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); | 
| - | 
| + PageLoadTimingObserver() { | 
| // 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)); | 
| + content::BrowserThread::IO, FROM_HERE, base::Bind(&base::DoNothing), | 
| + base::Bind(&PageLoadTimingObserver::Quit, base::Unretained(this))); | 
| run_loop_.reset(new base::RunLoop()); | 
| run_loop_->Run(); | 
| run_loop_.reset(nullptr); | 
| } | 
| + ~PageLoadTimingObserver() {} | 
| + | 
| // Add the given timing fields to the set of fields to match on. | 
| void AddMatchingFields(ExpectedTimingFields fields) { | 
| matching_fields_ |= fields; | 
| @@ -74,10 +90,10 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| match_document_write_block_reload_ = count; | 
| } | 
| + // Waits for a PageLoadTiming that matches the fields set by | 
| // Waits for a TimingUpdated IPC that matches the fields set by | 
| - // |AddMatchingFields|. All matching fields must be set in a TimingUpdated | 
| - // IPC for it to end this wait. | 
| - void WaitForMatchingIPC() { | 
| + // UpdateTiming to end this wait. | 
| + void WaitForTimingUpdated() { | 
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 
| if (matched_timing_update_) | 
| return; | 
| @@ -87,19 +103,8 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| 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; | 
| - } | 
| - | 
| - bool OnTimingUpdated(const page_load_metrics::PageLoadTiming& timing, | 
| - const page_load_metrics::PageLoadMetadata& metadata) { | 
| + void UpdateTiming(const page_load_metrics::PageLoadTiming& timing, | 
| + const page_load_metrics::PageLoadMetadata& metadata) { | 
| if (match_document_write_block_reload_ > 0 && | 
| metadata.behavior_flags & | 
| blink::WebLoadingBehaviorFlag:: | 
| @@ -108,7 +113,7 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| } | 
| if (match_document_write_block_reload_ > 0) { | 
| - return true; | 
| + return; | 
| } | 
| if ((!(matching_fields_ & FIRST_PAINT) || | 
| @@ -122,17 +127,17 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| // this waiter unblocks. | 
| content::BrowserThread::PostTask( | 
| content::BrowserThread::IO, FROM_HERE, | 
| - base::BindOnce(&TimingUpdatedObserver::BounceTimingUpdate, this, | 
| - timing, metadata)); | 
| + base::Bind(&PageLoadTimingObserver::BounceTimingUpdate, | 
| + base::Unretained(this))); | 
| } | 
| - return true; | 
| } | 
| - void BounceTimingUpdate(const page_load_metrics::PageLoadTiming& timing, | 
| - const page_load_metrics::PageLoadMetadata& metadata) { | 
| + private: | 
| + void BounceTimingUpdate() { | 
| content::BrowserThread::PostTask( | 
| content::BrowserThread::UI, FROM_HERE, | 
| - base::BindOnce(&TimingUpdatedObserver::SetTimingUpdatedAndQuit, this)); | 
| + base::Bind(&PageLoadTimingObserver::SetTimingUpdatedAndQuit, | 
| + base::Unretained(this))); | 
| } | 
| void Quit() { | 
| @@ -147,8 +152,6 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| Quit(); | 
| } | 
| - ~TimingUpdatedObserver() override {} | 
| - | 
| std::unique_ptr<base::RunLoop> run_loop_; | 
| int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. | 
| bool matched_timing_update_ = false; | 
| @@ -157,10 +160,80 @@ class TimingUpdatedObserver : public content::BrowserMessageFilter { | 
| } // namespace | 
| -class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 
| +namespace page_load_metrics { | 
| + | 
| +class FakePageLoadMetrics : public mojom::PageLoadMetrics { | 
| + public: | 
| + explicit FakePageLoadMetrics(content::RenderFrameHost* render_frame_host) { | 
| + metrics_observer_ = content::WebContentsUserData< | 
| + page_load_metrics::MetricsWebContentsObserver>:: | 
| + FromWebContents( | 
| + content::WebContents::FromRenderFrameHost(render_frame_host)); | 
| + metrics_observer_->page_load_metrics_binding_for_testing() | 
| + .SetCurrentTargetFrameForTesting(render_frame_host); | 
| + } | 
| + | 
| + ~FakePageLoadMetrics() override {} | 
| + | 
| + void AddObserver(PageLoadTimingObserver* observer) { | 
| 
Bryan McQuade
2017/04/26 16:04:34
ah, I see now why you have this class and this met
 
Ken Rockot(use gerrit already)
2017/04/26 16:11:41
The messages are always going to be dispatched to
 
Bryan McQuade
2017/04/26 20:41:51
I decided that adding testing hooks to the non-tes
 
lpy
2017/04/27 10:58:35
It looks good.
 | 
| + observers_.push_back(base::WrapUnique(observer)); | 
| + } | 
| + | 
| + private: | 
| + void UpdateTiming(const PageLoadTiming& timing, | 
| + const PageLoadMetadata& metadata) override { | 
| + metrics_observer_->UpdateTiming(timing, metadata); | 
| + for (auto& observer : observers_) { | 
| + observer->UpdateTiming(timing, metadata); | 
| + } | 
| + } | 
| + | 
| + MetricsWebContentsObserver* metrics_observer_; | 
| + std::vector<std::unique_ptr<PageLoadTimingObserver>> observers_; | 
| +}; | 
| + | 
| +} // namespace page_load_metrics | 
| + | 
| +namespace { | 
| + | 
| +class FakePageLoadMetricsBinder | 
| + : public content::WebContentsBindingSetTestBinder< | 
| + page_load_metrics::mojom::PageLoadMetrics> { | 
| + public: | 
| + FakePageLoadMetricsBinder( | 
| + page_load_metrics::mojom::PageLoadMetrics* page_load_metrics) | 
| + : page_load_metrics_(page_load_metrics) {} | 
| + ~FakePageLoadMetricsBinder() override {} | 
| + | 
| + void BindRequest(content::RenderFrameHost* frame_host, | 
| + page_load_metrics::mojom::PageLoadMetricsAssociatedRequest | 
| + request) override { | 
| + bindings_.AddBinding(page_load_metrics_, std::move(request), frame_host); | 
| + } | 
| + | 
| + private: | 
| + page_load_metrics::mojom::PageLoadMetrics* page_load_metrics_; | 
| + mojo::AssociatedBindingSet<page_load_metrics::mojom::PageLoadMetrics, | 
| + content::RenderFrameHost*> | 
| + bindings_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(FakePageLoadMetricsBinder); | 
| +}; | 
| + | 
| +} // namespace | 
| + | 
| +class PageLoadMetricsMojoficationBrowserTest : public InProcessBrowserTest { | 
| public: | 
| - PageLoadMetricsBrowserTest() {} | 
| - ~PageLoadMetricsBrowserTest() override {} | 
| + PageLoadMetricsMojoficationBrowserTest() {} | 
| + ~PageLoadMetricsMojoficationBrowserTest() override {} | 
| + | 
| + void SetUpCommandLine(base::CommandLine* command_line) override { | 
| + // We need to set the feature state before the render process is created, | 
| + // in order for it to inherit the feature state from the browser process. | 
| + // SetUp() runs too early, and SetUpOnMainThread() runs too late. | 
| + scoped_feature_list_.InitAndEnableFeature( | 
| + features::kPageLoadMetricsMojofication); | 
| + } | 
| protected: | 
| void NavigateToUntrackedUrl() { | 
| @@ -178,39 +251,41 @@ class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 
| return total_pageload_histograms - total_internal_histograms == 0; | 
| } | 
| - scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() { | 
| - content::WebContents* web_contents = | 
| - browser()->tab_strip_model()->GetActiveWebContents(); | 
| - scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver( | 
| - web_contents->GetRenderViewHost()->GetWidget())); | 
| + PageLoadTimingObserver* CreatePageLoadTimingObserver() { | 
| + if (!fake_page_load_metrics_) { | 
| + content::WebContents* web_contents = | 
| + browser()->tab_strip_model()->GetActiveWebContents(); | 
| + fake_page_load_metrics_.reset(new page_load_metrics::FakePageLoadMetrics( | 
| + web_contents->GetMainFrame())); | 
| + content::WebContentsBindingSet::GetForWebContents< | 
| + page_load_metrics::mojom::PageLoadMetrics>(web_contents) | 
| + ->SetBinderForTesting(base::MakeUnique<FakePageLoadMetricsBinder>( | 
| + fake_page_load_metrics_.get())); | 
| + } | 
| + PageLoadTimingObserver* observer = new PageLoadTimingObserver(); | 
| + fake_page_load_metrics_->AddObserver(observer); | 
| return observer; | 
| } | 
| + base::test::ScopedFeatureList scoped_feature_list_; | 
| + std::unique_ptr<page_load_metrics::FakePageLoadMetrics> | 
| + fake_page_load_metrics_; | 
| base::HistogramTester histogram_tester_; | 
| private: | 
| - DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); | 
| + DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsMojoficationBrowserTest); | 
| }; | 
| -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) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, NoNavigation) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, NewPage) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -234,7 +309,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NewPage) { | 
| EXPECT_FALSE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + SameDocumentNavigation) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -248,7 +326,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameDocumentNavigation) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + SameUrlNavigation) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -263,7 +344,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, SameUrlNavigation) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 2); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + NonHtmlMainResource) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -272,7 +356,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHtmlMainResource) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHttpOrHttpsUrl) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + NonHttpOrHttpsUrl) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL)); | 
| @@ -280,7 +367,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NonHttpOrHttpsUrl) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, HttpErrorPage) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, HttpErrorPage) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL( | 
| @@ -289,7 +378,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, HttpErrorPage) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, ChromeErrorPage) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + ChromeErrorPage) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| // Configure the network stack to fail all attempted loads with a network | 
| @@ -298,8 +390,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, ChromeErrorPage) { | 
| browser()->profile()->GetRequestContext(); | 
| content::BrowserThread::PostTask( | 
| content::BrowserThread::IO, FROM_HERE, | 
| - base::BindOnce(&FailAllNetworkTransactions, | 
| - base::RetainedRef(url_request_context_getter))); | 
| + base::Bind(&FailAllNetworkTransactions, | 
| + base::RetainedRef(url_request_context_getter))); | 
| ui_test_utils::NavigateToURL(browser(), | 
| embedded_test_server()->GetURL("/title1.html")); | 
| @@ -307,7 +399,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, ChromeErrorPage) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, Ignore204Pages) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, Ignore204Pages) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -316,7 +410,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, Ignore204Pages) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, IgnoreDownloads) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + IgnoreDownloads) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| base::ScopedTempDir downloads_directory; | 
| @@ -336,24 +433,29 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, IgnoreDownloads) { | 
| EXPECT_TRUE(NoPageLoadMetricsRecorded()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PreloadDocumentWrite) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + PreloadDocumentWrite) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL( | 
| browser(), embedded_test_server()->GetURL( | 
| "/page_load_metrics/document_write_external_script.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + NoPreloadDocumentWrite) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL( | 
| @@ -365,17 +467,19 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoPreloadDocumentWrite) { | 
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + NoDocumentWrite) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL(browser(), | 
| embedded_test_server()->GetURL("/title1.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramDocWriteParseStartToFirstContentfulPaint, 0); | 
| @@ -384,33 +488,36 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWrite) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteBlock) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + DocumentWriteBlock) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL( | 
| browser(), embedded_test_server()->GetURL( | 
| "/page_load_metrics/document_write_script_block.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + DocumentWriteReload) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| - scoped_refptr<TimingUpdatedObserver> reload_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver* reload_observer = CreatePageLoadTimingObserver(); | 
| reload_observer->MatchDocumentWriteBlockReload(2); | 
| ui_test_utils::NavigateToURL( | 
| @@ -429,8 +536,8 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| - reload_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| + reload_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramDocWriteBlockParseStartToFirstContentfulPaint, 1); | 
| @@ -440,7 +547,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteReload) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + DocumentWriteAsync) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL( | 
| @@ -453,7 +563,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteAsync) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + DocumentWriteSameDomain) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL( | 
| @@ -466,7 +579,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, DocumentWriteSameDomain) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + NoDocumentWriteScript) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL( | 
| @@ -479,18 +595,13 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, NoDocumentWriteScript) { | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramDocWriteBlockCount, 0); | 
| } | 
| -// TODO(crbug.com/712935): Flaky on Linux dbg. | 
| -#if defined(OS_LINUX) && !defined(NDEBUG) | 
| -#define MAYBE_BadXhtml DISABLED_BadXhtml | 
| -#else | 
| -#define MAYBE_BadXhtml BadXhtml | 
| -#endif | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, BadXhtml) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> timing_observer = | 
| - CreateTimingUpdatedObserver(); | 
| - timing_observer->AddMatchingFields(TimingUpdatedObserver::FIRST_PAINT); | 
| + PageLoadTimingObserver* timing_observer = CreatePageLoadTimingObserver(); | 
| + timing_observer->AddMatchingFields(PageLoadTimingObserver::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 +612,7 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { | 
| browser(), | 
| embedded_test_server()->GetURL("/page_load_metrics/badxml.xhtml")); | 
| - timing_observer->WaitForMatchingIPC(); | 
| + timing_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstLayout, 0); | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstPaint, 0); | 
| @@ -521,7 +632,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_BadXhtml) { | 
| // Test code that aborts provisional navigations. | 
| // TODO(csharrison): Move these to unit tests once the navigation API in content | 
| // properly calls NavigationHandle/NavigationThrottle methods. | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortNewNavigation) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + AbortNewNavigation) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| GURL url(embedded_test_server()->GetURL("/title1.html")); | 
| @@ -544,7 +658,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortNewNavigation) { | 
| internal::kHistogramAbortNewNavigationBeforeCommit, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, AbortReload) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| GURL url(embedded_test_server()->GetURL("/title1.html")); | 
| @@ -571,7 +687,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortReload) { | 
| #else | 
| #define MAYBE_AbortClose AbortClose | 
| #endif | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_AbortClose) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| + MAYBE_AbortClose) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| GURL url(embedded_test_server()->GetURL("/title1.html")); | 
| @@ -590,7 +709,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MAYBE_AbortClose) { | 
| 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortMultiple) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, AbortMultiple) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| GURL url(embedded_test_server()->GetURL("/title1.html")); | 
| @@ -625,8 +746,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, AbortMultiple) { | 
| internal::kHistogramAbortNewNavigationBeforeCommit, 2); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| NoAbortMetricsOnClientRedirect) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| GURL first_url(embedded_test_server()->GetURL("/title1.html")); | 
| @@ -655,8 +778,10 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| .empty()); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| FirstMeaningfulPaintRecorded) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), | 
| @@ -670,33 +795,34 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| kNetworkIdleTime + kMargin); | 
| bool result; | 
| EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 
| - browser()->tab_strip_model()->GetActiveWebContents(), | 
| - javascript, &result)); | 
| + browser()->tab_strip_model()->GetActiveWebContents(), javascript, | 
| + &result)); | 
| EXPECT_TRUE(result); | 
| NavigateToUntrackedUrl(); | 
| histogram_tester_.ExpectUniqueSample( | 
| internal::kHistogramFirstMeaningfulPaintStatus, | 
| internal::FIRST_MEANINGFUL_PAINT_RECORDED, 1); | 
| - histogram_tester_.ExpectTotalCount( | 
| - internal::kHistogramFirstMeaningfulPaint, 1); | 
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstMeaningfulPaint, | 
| + 1); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramParseStartToFirstMeaningfulPaint, 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| FirstMeaningfulPaintNotRecorded) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL( | 
| browser(), embedded_test_server()->GetURL( | 
| "/page_load_metrics/page_with_active_connections.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| // Navigate away before a FMP is reported. | 
| NavigateToUntrackedUrl(); | 
| @@ -704,25 +830,26 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| histogram_tester_.ExpectUniqueSample( | 
| internal::kHistogramFirstMeaningfulPaintStatus, | 
| internal::FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, 1); | 
| - histogram_tester_.ExpectTotalCount( | 
| - internal::kHistogramFirstMeaningfulPaint, 0); | 
| + histogram_tester_.ExpectTotalCount(internal::kHistogramFirstMeaningfulPaint, | 
| + 0); | 
| histogram_tester_.ExpectTotalCount( | 
| internal::kHistogramParseStartToFirstMeaningfulPaint, 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| NoStatePrefetchObserverCacheable) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL(browser(), | 
| embedded_test_server()->GetURL("/title1.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 0); | 
| @@ -730,19 +857,20 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, | 
| NoStatePrefetchObserverNoStore) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::FIRST_CONTENTFUL_PAINT); | 
| + PageLoadTimingObserver::FIRST_CONTENTFUL_PAINT); | 
| ui_test_utils::NavigateToURL(browser(), | 
| embedded_test_server()->GetURL("/nostore.html")); | 
| - fcp_observer->WaitForMatchingIPC(); | 
| + fcp_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount( | 
| "Prerender.none_PrefetchTTFCP.Reference.NoStore.Visible", 1); | 
| @@ -750,13 +878,14 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, | 
| "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, CSSTiming) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| - scoped_refptr<TimingUpdatedObserver> fcp_observer = | 
| - CreateTimingUpdatedObserver(); | 
| + PageLoadTimingObserver* fcp_observer = CreatePageLoadTimingObserver(); | 
| fcp_observer->AddMatchingFields( | 
| - TimingUpdatedObserver::STYLE_UPDATE_BEFORE_FCP); | 
| + PageLoadTimingObserver::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 +894,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_observer->WaitForTimingUpdated(); | 
| histogram_tester_.ExpectTotalCount(internal::kHistogramFirstContentfulPaint, | 
| 1); | 
| @@ -777,7 +906,9 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, CSSTiming) { | 
| "PageLoad.CSSTiming.ParseAndUpdate.BeforeFirstContentfulPaint", 1); | 
| } | 
| -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, PayloadSize) { | 
| +IN_PROC_BROWSER_TEST_F(PageLoadMetricsMojoficationBrowserTest, PayloadSize) { | 
| + ASSERT_TRUE( | 
| + base::FeatureList::IsEnabled(features::kPageLoadMetricsMojofication)); | 
| ASSERT_TRUE(embedded_test_server()->Start()); | 
| ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |