| Index: chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| index 99bcbf8ea99f06f947e2b57de2e6ce964fb5203c..ba0fbf0d6b9ddaeb76cca2ee656e642e998dc6e6 100644
|
| --- a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| +++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
|
| @@ -44,9 +44,9 @@ class TestPageLoadMetricsObserver
|
| public:
|
| TestPageLoadMetricsObserver(
|
| content::WebContents* web_contents,
|
| - std::vector<PageLoadTiming>* updated_timings,
|
| - std::vector<PageLoadTiming>* updated_subframe_timings,
|
| - std::vector<PageLoadTiming>* complete_timings,
|
| + std::vector<mojom::PageLoadTimingPtr>* updated_timings,
|
| + std::vector<mojom::PageLoadTimingPtr>* updated_subframe_timings,
|
| + std::vector<mojom::PageLoadTimingPtr>* complete_timings,
|
| std::vector<GURL>* observed_committed_urls)
|
| : MetricsWebContentsObserver::TestingObserver(web_contents),
|
| updated_timings_(updated_timings),
|
| @@ -61,34 +61,34 @@ class TestPageLoadMetricsObserver
|
| return CONTINUE_OBSERVING;
|
| }
|
|
|
| - void OnTimingUpdate(const PageLoadTiming& timing,
|
| + void OnTimingUpdate(const mojom::PageLoadTiming& timing,
|
| const PageLoadExtraInfo& extra_info) override {
|
| - updated_timings_->push_back(timing);
|
| + updated_timings_->push_back(timing.Clone());
|
| }
|
|
|
| void OnTimingUpdated(bool is_main_frame,
|
| - const PageLoadTiming& timing,
|
| - const PageLoadMetadata& metadata) override {
|
| + const mojom::PageLoadTiming& timing,
|
| + const mojom::PageLoadMetadata& metadata) override {
|
| if (!is_main_frame) {
|
| - updated_subframe_timings_->push_back(timing);
|
| + updated_subframe_timings_->push_back(timing.Clone());
|
| }
|
| }
|
|
|
| - void OnComplete(const PageLoadTiming& timing,
|
| + void OnComplete(const mojom::PageLoadTiming& timing,
|
| const PageLoadExtraInfo& extra_info) override {
|
| - complete_timings_->push_back(timing);
|
| + complete_timings_->push_back(timing.Clone());
|
| }
|
|
|
| ObservePolicy FlushMetricsOnAppEnterBackground(
|
| - const PageLoadTiming& timing,
|
| + const mojom::PageLoadTiming& timing,
|
| const PageLoadExtraInfo& extra_info) override {
|
| return STOP_OBSERVING;
|
| }
|
|
|
| private:
|
| - std::vector<PageLoadTiming>* const updated_timings_;
|
| - std::vector<PageLoadTiming>* const updated_subframe_timings_;
|
| - std::vector<PageLoadTiming>* const complete_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr>* const updated_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr>* const updated_subframe_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr>* const complete_timings_;
|
| std::vector<GURL>* const observed_committed_urls_;
|
| };
|
|
|
| @@ -114,7 +114,7 @@ class FilteringPageLoadMetricsObserver : public PageLoadMetricsObserver {
|
| return should_ignore ? STOP_OBSERVING : CONTINUE_OBSERVING;
|
| }
|
|
|
| - void OnComplete(const PageLoadTiming& timing,
|
| + void OnComplete(const mojom::PageLoadTiming& timing,
|
| const PageLoadExtraInfo& extra_info) override {
|
| completed_filtered_urls_->push_back(extra_info.url);
|
| }
|
| @@ -139,13 +139,14 @@ class TestPageLoadMetricsEmbedderInterface
|
| tracker->AddObserver(base::MakeUnique<FilteringPageLoadMetricsObserver>(
|
| &completed_filtered_urls_));
|
| }
|
| - const std::vector<PageLoadTiming>& updated_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& updated_timings() const {
|
| return updated_timings_;
|
| }
|
| - const std::vector<PageLoadTiming>& complete_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& complete_timings() const {
|
| return complete_timings_;
|
| }
|
| - const std::vector<PageLoadTiming>& updated_subframe_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& updated_subframe_timings()
|
| + const {
|
| return updated_subframe_timings_;
|
| }
|
|
|
| @@ -160,9 +161,9 @@ class TestPageLoadMetricsEmbedderInterface
|
| }
|
|
|
| private:
|
| - std::vector<PageLoadTiming> updated_timings_;
|
| - std::vector<PageLoadTiming> updated_subframe_timings_;
|
| - std::vector<PageLoadTiming> complete_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr> updated_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr> updated_subframe_timings_;
|
| + std::vector<mojom::PageLoadTimingPtr> complete_timings_;
|
| std::vector<GURL> observed_committed_urls_;
|
| std::vector<GURL> completed_filtered_urls_;
|
| content::WebContents* web_contents_;
|
| @@ -185,13 +186,14 @@ class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
|
| ->NavigateAndCommit(GURL(url::kAboutBlankURL));
|
| }
|
|
|
| - void SimulateTimingUpdate(const PageLoadTiming& timing) {
|
| + void SimulateTimingUpdate(const mojom::PageLoadTiming& timing) {
|
| SimulateTimingUpdate(timing, web_contents()->GetMainFrame());
|
| }
|
|
|
| - void SimulateTimingUpdate(const PageLoadTiming& timing,
|
| + void SimulateTimingUpdate(const mojom::PageLoadTiming& timing,
|
| content::RenderFrameHost* render_frame_host) {
|
| - observer_->OnTimingUpdated(render_frame_host, timing, PageLoadMetadata());
|
| + observer_->OnTimingUpdated(render_frame_host, timing,
|
| + mojom::PageLoadMetadata());
|
| }
|
|
|
| void AttachObserver() {
|
| @@ -222,19 +224,20 @@ class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
|
| int CountEmptyCompleteTimingReported() {
|
| int empty = 0;
|
| for (const auto& timing : embedder_interface_->complete_timings()) {
|
| - if (timing.IsEmpty())
|
| + if (page_load_metrics::IsEmpty(*timing))
|
| ++empty;
|
| }
|
| return empty;
|
| }
|
|
|
| - const std::vector<PageLoadTiming>& updated_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& updated_timings() const {
|
| return embedder_interface_->updated_timings();
|
| }
|
| - const std::vector<PageLoadTiming>& complete_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& complete_timings() const {
|
| return embedder_interface_->complete_timings();
|
| }
|
| - const std::vector<PageLoadTiming>& updated_subframe_timings() const {
|
| + const std::vector<mojom::PageLoadTimingPtr>& updated_subframe_timings()
|
| + const {
|
| return embedder_interface_->updated_subframe_timings();
|
| }
|
| int CountCompleteTimingReported() { return complete_timings().size(); }
|
| @@ -263,7 +266,8 @@ class MetricsWebContentsObserverTest : public ChromeRenderViewHostTestHarness {
|
| };
|
|
|
| TEST_F(MetricsWebContentsObserverTest, SuccessfulMainFrameNavigation) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -292,11 +296,12 @@ TEST_F(MetricsWebContentsObserverTest, SuccessfulMainFrameNavigation) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, SubFrame) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
| timing.response_start = base::TimeDelta::FromMilliseconds(10);
|
| - timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(20);
|
| - timing.document_timing.first_layout = base::TimeDelta::FromMilliseconds(30);
|
| + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(20);
|
| + timing.document_timing->first_layout = base::TimeDelta::FromMilliseconds(30);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| content::WebContentsTester::For(web_contents());
|
| @@ -304,21 +309,22 @@ TEST_F(MetricsWebContentsObserverTest, SubFrame) {
|
| SimulateTimingUpdate(timing);
|
|
|
| ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - EXPECT_EQ(timing, updated_timings().back());
|
| + EXPECT_TRUE(timing.Equals(*updated_timings().back()));
|
|
|
| content::RenderFrameHostTester* rfh_tester =
|
| content::RenderFrameHostTester::For(main_rfh());
|
| content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
|
|
|
| // Dispatch a timing update for the child frame that includes a first paint.
|
| - PageLoadTiming subframe_timing;
|
| + mojom::PageLoadTiming subframe_timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&subframe_timing);
|
| subframe_timing.navigation_start = base::Time::FromDoubleT(2);
|
| subframe_timing.response_start = base::TimeDelta::FromMilliseconds(10);
|
| - subframe_timing.parse_timing.parse_start =
|
| + subframe_timing.parse_timing->parse_start =
|
| base::TimeDelta::FromMilliseconds(20);
|
| - subframe_timing.document_timing.first_layout =
|
| + subframe_timing.document_timing->first_layout =
|
| base::TimeDelta::FromMilliseconds(30);
|
| - subframe_timing.paint_timing.first_paint =
|
| + subframe_timing.paint_timing->first_paint =
|
| base::TimeDelta::FromMilliseconds(40);
|
| content::RenderFrameHostTester* subframe_tester =
|
| content::RenderFrameHostTester::For(subframe);
|
| @@ -328,13 +334,13 @@ TEST_F(MetricsWebContentsObserverTest, SubFrame) {
|
| subframe_tester->SimulateNavigationStop();
|
|
|
| ASSERT_EQ(1, CountUpdatedSubFrameTimingReported());
|
| - EXPECT_EQ(subframe_timing, updated_subframe_timings().back());
|
| + EXPECT_TRUE(subframe_timing.Equals(*updated_subframe_timings().back()));
|
|
|
| // The subframe update which included a paint should have also triggered
|
| // a main frame update, which includes a first paint.
|
| ASSERT_EQ(2, CountUpdatedTimingReported());
|
| - EXPECT_NE(timing, updated_timings().back());
|
| - EXPECT_TRUE(updated_timings().back().paint_timing.first_paint);
|
| + EXPECT_FALSE(timing.Equals(*updated_timings().back()));
|
| + EXPECT_TRUE(updated_timings().back()->paint_timing->first_paint);
|
|
|
| // Navigate again to see if the timing updated for a subframe message.
|
| web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| @@ -344,13 +350,14 @@ TEST_F(MetricsWebContentsObserverTest, SubFrame) {
|
| ASSERT_EQ(0, CountEmptyCompleteTimingReported());
|
|
|
| ASSERT_EQ(1, CountUpdatedSubFrameTimingReported());
|
| - EXPECT_EQ(subframe_timing, updated_subframe_timings().back());
|
| + EXPECT_TRUE(subframe_timing.Equals(*updated_subframe_timings().back()));
|
|
|
| CheckNoErrorEvents();
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -380,7 +387,8 @@ TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, DontLogNewTabPage) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -397,7 +405,8 @@ TEST_F(MetricsWebContentsObserverTest, DontLogNewTabPage) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(10);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -417,7 +426,8 @@ TEST_F(MetricsWebContentsObserverTest, DontLogIrrelevantNavigation) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, EmptyTimingError) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| content::WebContentsTester::For(web_contents());
|
| @@ -441,8 +451,9 @@ TEST_F(MetricsWebContentsObserverTest, EmptyTimingError) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, NullNavigationStartError) {
|
| - PageLoadTiming timing;
|
| - timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(1);
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| content::WebContentsTester::For(web_contents());
|
| @@ -466,9 +477,10 @@ TEST_F(MetricsWebContentsObserverTest, NullNavigationStartError) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, TimingOrderError) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
| - timing.parse_timing.parse_stop = base::TimeDelta::FromMilliseconds(1);
|
| + timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(1);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| content::WebContentsTester::For(web_contents());
|
| @@ -492,9 +504,11 @@ TEST_F(MetricsWebContentsObserverTest, TimingOrderError) {
|
| }
|
|
|
| TEST_F(MetricsWebContentsObserverTest, BadIPC) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(10);
|
| - PageLoadTiming timing2;
|
| + mojom::PageLoadTiming timing2;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing2);
|
| timing2.navigation_start = base::Time::FromDoubleT(100);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -517,7 +531,8 @@ TEST_F(MetricsWebContentsObserverTest, ObservePartialNavigation) {
|
| DeleteContents();
|
| SetContents(CreateTestWebContents());
|
|
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(10);
|
|
|
| content::WebContentsTester* web_contents_tester =
|
| @@ -711,7 +726,8 @@ TEST_F(MetricsWebContentsObserverTest, StopObservingOnStart) {
|
| // We buffer cross frame timings in order to provide a consistent view of
|
| // timing data to observers. See crbug.com/722860 for more.
|
| TEST_F(MetricsWebContentsObserverTest, OutOfOrderCrossFrameTiming) {
|
| - PageLoadTiming timing;
|
| + mojom::PageLoadTiming timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&timing);
|
| timing.navigation_start = base::Time::FromDoubleT(1);
|
| timing.response_start = base::TimeDelta::FromMilliseconds(10);
|
|
|
| @@ -721,21 +737,22 @@ TEST_F(MetricsWebContentsObserverTest, OutOfOrderCrossFrameTiming) {
|
| SimulateTimingUpdate(timing);
|
|
|
| ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - EXPECT_EQ(timing, updated_timings().back());
|
| + EXPECT_TRUE(timing.Equals(*updated_timings().back()));
|
|
|
| content::RenderFrameHostTester* rfh_tester =
|
| content::RenderFrameHostTester::For(main_rfh());
|
| content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
|
|
|
| // Dispatch a timing update for the child frame that includes a first paint.
|
| - PageLoadTiming subframe_timing;
|
| + mojom::PageLoadTiming subframe_timing;
|
| + page_load_metrics::InitPageLoadTimingForTest(&subframe_timing);
|
| subframe_timing.navigation_start = base::Time::FromDoubleT(2);
|
| subframe_timing.response_start = base::TimeDelta::FromMilliseconds(10);
|
| - subframe_timing.parse_timing.parse_start =
|
| + subframe_timing.parse_timing->parse_start =
|
| base::TimeDelta::FromMilliseconds(20);
|
| - subframe_timing.document_timing.first_layout =
|
| + subframe_timing.document_timing->first_layout =
|
| base::TimeDelta::FromMilliseconds(30);
|
| - subframe_timing.paint_timing.first_paint =
|
| + subframe_timing.paint_timing->first_paint =
|
| base::TimeDelta::FromMilliseconds(40);
|
| content::RenderFrameHostTester* subframe_tester =
|
| content::RenderFrameHostTester::For(subframe);
|
| @@ -749,30 +766,33 @@ TEST_F(MetricsWebContentsObserverTest, OutOfOrderCrossFrameTiming) {
|
| // hasn't received updates for required earlier events such as parse_start and
|
| // first_layout.
|
| ASSERT_EQ(1, CountUpdatedSubFrameTimingReported());
|
| - EXPECT_EQ(subframe_timing, updated_subframe_timings().back());
|
| + EXPECT_TRUE(subframe_timing.Equals(*updated_subframe_timings().back()));
|
| ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - EXPECT_EQ(timing, updated_timings().back());
|
| + EXPECT_TRUE(timing.Equals(*updated_timings().back()));
|
|
|
| // Dispatch the parse_start event in the parent. We should still not observe
|
| // a first paint main frame update, since we don't yet have a first_layout.
|
| - timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(20);
|
| + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(20);
|
| SimulateTimingUpdate(timing);
|
| ASSERT_EQ(1, CountUpdatedTimingReported());
|
| - EXPECT_NE(timing, updated_timings().back());
|
| - EXPECT_FALSE(updated_timings().back().parse_timing.parse_start);
|
| - EXPECT_FALSE(updated_timings().back().paint_timing.first_paint);
|
| + EXPECT_FALSE(timing.Equals(*updated_timings().back()));
|
| + EXPECT_FALSE(updated_timings().back()->parse_timing->parse_start);
|
| + EXPECT_FALSE(updated_timings().back()->paint_timing->first_paint);
|
|
|
| // Dispatch a first_layout in the parent. We should now unbuffer the first
|
| // paint main frame update and receive a main frame update with a first paint
|
| // value.
|
| - timing.document_timing.first_layout = base::TimeDelta::FromMilliseconds(30);
|
| + timing.document_timing->first_layout = base::TimeDelta::FromMilliseconds(30);
|
| SimulateTimingUpdate(timing);
|
| ASSERT_EQ(2, CountUpdatedTimingReported());
|
| - EXPECT_NE(timing, updated_timings().back());
|
| - EXPECT_EQ(updated_timings().back().parse_timing, timing.parse_timing);
|
| - EXPECT_EQ(updated_timings().back().document_timing, timing.document_timing);
|
| - EXPECT_NE(updated_timings().back().paint_timing, timing.paint_timing);
|
| - EXPECT_TRUE(updated_timings().back().paint_timing.first_paint);
|
| + EXPECT_FALSE(timing.Equals(*updated_timings().back()));
|
| + EXPECT_TRUE(
|
| + updated_timings().back()->parse_timing->Equals(*timing.parse_timing));
|
| + EXPECT_TRUE(updated_timings().back()->document_timing->Equals(
|
| + *timing.document_timing));
|
| + EXPECT_FALSE(
|
| + updated_timings().back()->paint_timing->Equals(*timing.paint_timing));
|
| + EXPECT_TRUE(updated_timings().back()->paint_timing->first_paint);
|
|
|
| // Navigate again to see if the timing updated for a subframe message.
|
| web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2));
|
| @@ -782,7 +802,7 @@ TEST_F(MetricsWebContentsObserverTest, OutOfOrderCrossFrameTiming) {
|
| ASSERT_EQ(0, CountEmptyCompleteTimingReported());
|
|
|
| ASSERT_EQ(1, CountUpdatedSubFrameTimingReported());
|
| - EXPECT_EQ(subframe_timing, updated_subframe_timings().back());
|
| + EXPECT_TRUE(subframe_timing.Equals(*updated_subframe_timings().back()));
|
|
|
| CheckNoErrorEvents();
|
| }
|
|
|