Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 287 observed_committed_urls_from_on_start().at(1).spec()); | 287 observed_committed_urls_from_on_start().at(1).spec()); |
| 288 ASSERT_EQ(1, CountUpdatedTimingReported()); | 288 ASSERT_EQ(1, CountUpdatedTimingReported()); |
| 289 ASSERT_EQ(0, CountUpdatedSubFrameTimingReported()); | 289 ASSERT_EQ(0, CountUpdatedSubFrameTimingReported()); |
| 290 | 290 |
| 291 CheckNoErrorEvents(); | 291 CheckNoErrorEvents(); |
| 292 } | 292 } |
| 293 | 293 |
| 294 TEST_F(MetricsWebContentsObserverTest, SubFrame) { | 294 TEST_F(MetricsWebContentsObserverTest, SubFrame) { |
| 295 PageLoadTiming timing; | 295 PageLoadTiming timing; |
| 296 timing.navigation_start = base::Time::FromDoubleT(1); | 296 timing.navigation_start = base::Time::FromDoubleT(1); |
| 297 timing.response_start = base::TimeDelta::FromMilliseconds(10); | |
| 298 timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(20); | |
| 299 timing.document_timing.first_layout = base::TimeDelta::FromMilliseconds(30); | |
| 297 | 300 |
| 298 content::WebContentsTester* web_contents_tester = | 301 content::WebContentsTester* web_contents_tester = |
| 299 content::WebContentsTester::For(web_contents()); | 302 content::WebContentsTester::For(web_contents()); |
| 300 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 303 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 301 SimulateTimingUpdate(timing); | 304 SimulateTimingUpdate(timing); |
| 302 | 305 |
| 306 ASSERT_EQ(1, CountUpdatedTimingReported()); | |
| 307 EXPECT_EQ(timing, updated_timings().back()); | |
| 308 | |
| 303 content::RenderFrameHostTester* rfh_tester = | 309 content::RenderFrameHostTester* rfh_tester = |
| 304 content::RenderFrameHostTester::For(main_rfh()); | 310 content::RenderFrameHostTester::For(main_rfh()); |
| 305 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); | 311 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); |
| 306 | 312 |
| 313 // Dispatch a timing update for the child frame that includes a first paint. | |
| 307 PageLoadTiming subframe_timing; | 314 PageLoadTiming subframe_timing; |
| 308 subframe_timing.navigation_start = base::Time::FromDoubleT(2); | 315 subframe_timing.navigation_start = base::Time::FromDoubleT(2); |
| 316 subframe_timing.response_start = base::TimeDelta::FromMilliseconds(10); | |
| 317 subframe_timing.parse_timing.parse_start = | |
| 318 base::TimeDelta::FromMilliseconds(20); | |
| 319 subframe_timing.document_timing.first_layout = | |
| 320 base::TimeDelta::FromMilliseconds(30); | |
| 321 subframe_timing.paint_timing.first_paint = | |
| 322 base::TimeDelta::FromMilliseconds(40); | |
| 309 content::RenderFrameHostTester* subframe_tester = | 323 content::RenderFrameHostTester* subframe_tester = |
| 310 content::RenderFrameHostTester::For(subframe); | 324 content::RenderFrameHostTester::For(subframe); |
| 311 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); | 325 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); |
| 312 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); | 326 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); |
| 313 SimulateTimingUpdate(subframe_timing, subframe); | 327 SimulateTimingUpdate(subframe_timing, subframe); |
| 314 subframe_tester->SimulateNavigationStop(); | 328 subframe_tester->SimulateNavigationStop(); |
| 315 | 329 |
| 330 ASSERT_EQ(1, CountUpdatedSubFrameTimingReported()); | |
| 331 EXPECT_EQ(subframe_timing, updated_subframe_timings().back()); | |
| 332 | |
| 333 // The subframe update which included a paint should have also triggered | |
| 334 // a main frame update, which includes a first paint. | |
| 335 ASSERT_EQ(2, CountUpdatedTimingReported()); | |
| 336 EXPECT_NE(timing, updated_timings().back()); | |
| 337 EXPECT_TRUE(updated_timings().back().paint_timing.first_paint); | |
| 338 | |
| 316 // Navigate again to see if the timing updated for a subframe message. | 339 // Navigate again to see if the timing updated for a subframe message. |
| 317 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 340 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
| 318 | 341 |
| 319 ASSERT_EQ(1, CountCompleteTimingReported()); | 342 ASSERT_EQ(1, CountCompleteTimingReported()); |
| 320 ASSERT_EQ(1, CountUpdatedTimingReported()); | 343 ASSERT_EQ(2, CountUpdatedTimingReported()); |
| 321 ASSERT_EQ(0, CountEmptyCompleteTimingReported()); | 344 ASSERT_EQ(0, CountEmptyCompleteTimingReported()); |
| 322 EXPECT_EQ(timing, updated_timings().at(0)); | |
| 323 | 345 |
| 324 ASSERT_EQ(1, CountUpdatedSubFrameTimingReported()); | 346 ASSERT_EQ(1, CountUpdatedSubFrameTimingReported()); |
| 325 EXPECT_EQ(subframe_timing, updated_subframe_timings().at(0)); | 347 EXPECT_EQ(subframe_timing, updated_subframe_timings().back()); |
| 326 | 348 |
| 327 CheckNoErrorEvents(); | 349 CheckNoErrorEvents(); |
| 328 } | 350 } |
| 329 | 351 |
| 330 TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) { | 352 TEST_F(MetricsWebContentsObserverTest, SameDocumentNoTrigger) { |
| 331 PageLoadTiming timing; | 353 PageLoadTiming timing; |
| 332 timing.navigation_start = base::Time::FromDoubleT(1); | 354 timing.navigation_start = base::Time::FromDoubleT(1); |
| 333 | 355 |
| 334 content::WebContentsTester* web_contents_tester = | 356 content::WebContentsTester* web_contents_tester = |
| 335 content::WebContentsTester::For(web_contents()); | 357 content::WebContentsTester::For(web_contents()); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 | 701 |
| 680 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | 702 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); |
| 681 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}), | 703 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl)}), |
| 682 completed_filtered_urls()); | 704 completed_filtered_urls()); |
| 683 | 705 |
| 684 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | 706 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); |
| 685 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl), GURL(kDefaultTestUrl2)}), | 707 ASSERT_EQ(std::vector<GURL>({GURL(kDefaultTestUrl), GURL(kDefaultTestUrl2)}), |
| 686 completed_filtered_urls()); | 708 completed_filtered_urls()); |
| 687 } | 709 } |
| 688 | 710 |
| 711 TEST_F(MetricsWebContentsObserverTest, OutOfOrderCrossFrameTiming) { | |
|
jkarlin
2017/05/16 16:23:11
Please add a comment that links to the crbug that
Bryan McQuade
2017/05/16 16:33:48
Done
| |
| 712 PageLoadTiming timing; | |
| 713 timing.navigation_start = base::Time::FromDoubleT(1); | |
| 714 timing.response_start = base::TimeDelta::FromMilliseconds(10); | |
| 715 | |
| 716 content::WebContentsTester* web_contents_tester = | |
| 717 content::WebContentsTester::For(web_contents()); | |
| 718 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); | |
| 719 SimulateTimingUpdate(timing); | |
| 720 | |
| 721 ASSERT_EQ(1, CountUpdatedTimingReported()); | |
| 722 EXPECT_EQ(timing, updated_timings().back()); | |
| 723 | |
| 724 content::RenderFrameHostTester* rfh_tester = | |
| 725 content::RenderFrameHostTester::For(main_rfh()); | |
| 726 content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe"); | |
| 727 | |
| 728 // Dispatch a timing update for the child frame that includes a first paint. | |
| 729 PageLoadTiming subframe_timing; | |
| 730 subframe_timing.navigation_start = base::Time::FromDoubleT(2); | |
| 731 subframe_timing.response_start = base::TimeDelta::FromMilliseconds(10); | |
| 732 subframe_timing.parse_timing.parse_start = | |
| 733 base::TimeDelta::FromMilliseconds(20); | |
| 734 subframe_timing.document_timing.first_layout = | |
| 735 base::TimeDelta::FromMilliseconds(30); | |
| 736 subframe_timing.paint_timing.first_paint = | |
| 737 base::TimeDelta::FromMilliseconds(40); | |
| 738 content::RenderFrameHostTester* subframe_tester = | |
| 739 content::RenderFrameHostTester::For(subframe); | |
| 740 subframe_tester->SimulateNavigationStart(GURL(kDefaultTestUrl2)); | |
| 741 subframe_tester->SimulateNavigationCommit(GURL(kDefaultTestUrl2)); | |
| 742 SimulateTimingUpdate(subframe_timing, subframe); | |
| 743 subframe_tester->SimulateNavigationStop(); | |
| 744 | |
| 745 // Though a first paint was dispatched in the child, it should not yet be | |
| 746 // reflected as an updated timing in the main frame, since the main frame | |
| 747 // hasn't received updates for required earlier events such as parse_start and | |
| 748 // first_layout. | |
| 749 ASSERT_EQ(1, CountUpdatedSubFrameTimingReported()); | |
| 750 EXPECT_EQ(subframe_timing, updated_subframe_timings().back()); | |
| 751 ASSERT_EQ(1, CountUpdatedTimingReported()); | |
| 752 EXPECT_EQ(timing, updated_timings().back()); | |
| 753 | |
| 754 // Dispatch the parse_start event in the parent. We should still not observe | |
| 755 // a first paint main frame update, since we don't yet have a first_layout. | |
| 756 timing.parse_timing.parse_start = base::TimeDelta::FromMilliseconds(20); | |
| 757 SimulateTimingUpdate(timing); | |
| 758 ASSERT_EQ(1, CountUpdatedTimingReported()); | |
| 759 EXPECT_FALSE(updated_timings().back().paint_timing.first_paint); | |
| 760 | |
| 761 // Dispatch a first_layout in the parent. We should now unbuffer the first | |
| 762 // paint main frame update and receive a main frame update with a first paint | |
| 763 // value. | |
| 764 timing.document_timing.first_layout = base::TimeDelta::FromMilliseconds(30); | |
| 765 SimulateTimingUpdate(timing); | |
| 766 ASSERT_EQ(2, CountUpdatedTimingReported()); | |
| 767 EXPECT_NE(timing, updated_timings().back()); | |
| 768 EXPECT_TRUE(updated_timings().back().paint_timing.first_paint); | |
| 769 | |
| 770 // Navigate again to see if the timing updated for a subframe message. | |
| 771 web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl2)); | |
| 772 | |
| 773 ASSERT_EQ(1, CountCompleteTimingReported()); | |
| 774 ASSERT_EQ(2, CountUpdatedTimingReported()); | |
| 775 ASSERT_EQ(0, CountEmptyCompleteTimingReported()); | |
| 776 | |
| 777 ASSERT_EQ(1, CountUpdatedSubFrameTimingReported()); | |
| 778 EXPECT_EQ(subframe_timing, updated_subframe_timings().back()); | |
| 779 | |
| 780 CheckNoErrorEvents(); | |
| 781 } | |
| 782 | |
| 689 } // namespace page_load_metrics | 783 } // namespace page_load_metrics |
| OLD | NEW |