Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stddef.h> 5 #include <stddef.h>
6 #include <deque> 6 #include <deque>
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ref_counted_memory.h" 17 #include "base/memory/ref_counted_memory.h"
18 #include "base/memory/scoped_vector.h" 18 #include "base/memory/scoped_vector.h"
19 #include "base/memory/weak_ptr.h" 19 #include "base/memory/weak_ptr.h"
20 #include "base/path_service.h" 20 #include "base/path_service.h"
21 #include "base/run_loop.h" 21 #include "base/run_loop.h"
22 #include "base/scoped_observer.h" 22 #include "base/scoped_observer.h"
23 #include "base/stl_util.h" 23 #include "base/stl_util.h"
24 #include "base/strings/string_split.h" 24 #include "base/strings/string_split.h"
25 #include "base/strings/string_util.h" 25 #include "base/strings/string_util.h"
26 #include "base/strings/stringprintf.h" 26 #include "base/strings/stringprintf.h"
27 #include "base/strings/utf_string_conversions.h" 27 #include "base/strings/utf_string_conversions.h"
28 #include "base/test/scoped_feature_list.h" 28 #include "base/test/scoped_feature_list.h"
29 #include "base/test/simple_test_tick_clock.h"
29 #include "base/test/test_timeouts.h" 30 #include "base/test/test_timeouts.h"
30 #include "base/values.h" 31 #include "base/values.h"
31 #include "build/build_config.h" 32 #include "build/build_config.h"
32 #include "chrome/browser/browsing_data/browsing_data_helper.h" 33 #include "chrome/browser/browsing_data/browsing_data_helper.h"
33 #include "chrome/browser/browsing_data/browsing_data_remover.h" 34 #include "chrome/browser/browsing_data/browsing_data_remover.h"
34 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" 35 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
35 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" 36 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
36 #include "chrome/browser/chrome_content_browser_client.h" 37 #include "chrome/browser/chrome_content_browser_client.h"
37 #include "chrome/browser/chrome_notification_types.h" 38 #include "chrome/browser/chrome_notification_types.h"
38 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 39 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
39 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 40 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
40 #include "chrome/browser/extensions/extension_apitest.h" 41 #include "chrome/browser/extensions/extension_apitest.h"
41 #include "chrome/browser/external_protocol/external_protocol_handler.h" 42 #include "chrome/browser/external_protocol/external_protocol_handler.h"
42 #include "chrome/browser/net/prediction_options.h" 43 #include "chrome/browser/net/prediction_options.h"
44 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_ test_harness.h"
45 #include "chrome/browser/page_load_metrics/observers/prerender_page_load_metrics _observer.h"
43 #include "chrome/browser/password_manager/password_store_factory.h" 46 #include "chrome/browser/password_manager/password_store_factory.h"
44 #include "chrome/browser/predictors/autocomplete_action_predictor.h" 47 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
45 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" 48 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
46 #include "chrome/browser/prerender/prerender_contents.h" 49 #include "chrome/browser/prerender/prerender_contents.h"
47 #include "chrome/browser/prerender/prerender_field_trial.h" 50 #include "chrome/browser/prerender/prerender_field_trial.h"
48 #include "chrome/browser/prerender/prerender_handle.h" 51 #include "chrome/browser/prerender/prerender_handle.h"
49 #include "chrome/browser/prerender/prerender_link_manager.h" 52 #include "chrome/browser/prerender/prerender_link_manager.h"
50 #include "chrome/browser/prerender/prerender_link_manager_factory.h" 53 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
51 #include "chrome/browser/prerender/prerender_manager.h" 54 #include "chrome/browser/prerender/prerender_manager.h"
52 #include "chrome/browser/prerender/prerender_manager_factory.h" 55 #include "chrome/browser/prerender/prerender_manager_factory.h"
56 #include "chrome/browser/prerender/prerender_tab_helper.h"
53 #include "chrome/browser/prerender/prerender_test_utils.h" 57 #include "chrome/browser/prerender/prerender_test_utils.h"
54 #include "chrome/browser/profiles/profile.h" 58 #include "chrome/browser/profiles/profile.h"
55 #include "chrome/browser/profiles/profile_io_data.h" 59 #include "chrome/browser/profiles/profile_io_data.h"
56 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h" 60 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h"
57 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h" 61 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h"
58 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" 62 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
59 #include "chrome/browser/ui/browser.h" 63 #include "chrome/browser/ui/browser.h"
60 #include "chrome/browser/ui/browser_commands.h" 64 #include "chrome/browser/ui/browser_commands.h"
61 #include "chrome/browser/ui/browser_finder.h" 65 #include "chrome/browser/ui/browser_finder.h"
62 #include "chrome/browser/ui/browser_window.h" 66 #include "chrome/browser/ui/browser_window.h"
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 tab, 717 tab,
714 "window.domAutomationController.send(DidBackToOriginalPagePass())", 718 "window.domAutomationController.send(DidBackToOriginalPagePass())",
715 &js_result)); 719 &js_result));
716 EXPECT_TRUE(js_result); 720 EXPECT_TRUE(js_result);
717 } 721 }
718 722
719 void DisableJavascriptCalls() { 723 void DisableJavascriptCalls() {
720 call_javascript_ = false; 724 call_javascript_ = false;
721 } 725 }
722 726
727 void EnableJavascriptCalls() { call_javascript_ = true; }
728
723 void DisableLoadEventCheck() { 729 void DisableLoadEventCheck() {
724 check_load_events_ = false; 730 check_load_events_ = false;
725 } 731 }
726 732
727 const PrerenderLinkManager* GetPrerenderLinkManager() const { 733 const PrerenderLinkManager* GetPrerenderLinkManager() const {
728 PrerenderLinkManager* prerender_link_manager = 734 PrerenderLinkManager* prerender_link_manager =
729 PrerenderLinkManagerFactory::GetForProfile( 735 PrerenderLinkManagerFactory::GetForProfile(
730 current_browser()->profile()); 736 current_browser()->profile());
731 return prerender_link_manager; 737 return prerender_link_manager;
732 } 738 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 873 }
868 874
869 void AddPrerender(const GURL& url, int index) { 875 void AddPrerender(const GURL& url, int index) {
870 std::string javascript = base::StringPrintf( 876 std::string javascript = base::StringPrintf(
871 "AddPrerender('%s', %d)", url.spec().c_str(), index); 877 "AddPrerender('%s', %d)", url.spec().c_str(), index);
872 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 878 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame();
873 render_frame_host->ExecuteJavaScriptForTests( 879 render_frame_host->ExecuteJavaScriptForTests(
874 base::ASCIIToUTF16(javascript)); 880 base::ASCIIToUTF16(javascript));
875 } 881 }
876 882
883 base::SimpleTestTickClock* OverridePrerenderManagerTimeTicks() {
884 auto clock = base::MakeUnique<base::SimpleTestTickClock>();
885 auto clock_ptr = clock.get();
886 // The default zero time causes the prerender manager to do strange things.
887 clock->Advance(base::TimeDelta::FromSeconds(1));
888 GetPrerenderManager()->SetTickClockForTesting(std::move(clock));
889 return clock_ptr;
890 }
891
892 void SetMidLoadClockAdvance(base::SimpleTestTickClock* clock,
893 base::TimeDelta delta) {
894 mid_load_clock_ = clock;
895 mid_load_clock_tick_advance_ = delta;
896 }
897
898 void ClearMidLoadClock() {
899 mid_load_clock_tick_advance_ = base::TimeDelta();
900 mid_load_clock_ = nullptr;
901 }
902
877 private: 903 private:
878 // TODO(davidben): Remove this altogether so the tests don't globally assume 904 // TODO(davidben): Remove this altogether so the tests don't globally assume
879 // only one prerender. 905 // only one prerender.
880 TestPrerenderContents* GetPrerenderContents() const { 906 TestPrerenderContents* GetPrerenderContents() const {
881 return GetPrerenderContentsFor(dest_url_); 907 return GetPrerenderContentsFor(dest_url_);
882 } 908 }
883 909
884 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl( 910 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl(
885 const GURL& prerender_url, 911 const GURL& prerender_url,
886 const std::vector<FinalStatus>& expected_final_status_queue, 912 const std::vector<FinalStatus>& expected_final_status_queue,
887 int expected_number_of_loads) { 913 int expected_number_of_loads) {
888 dest_url_ = prerender_url; 914 dest_url_ = prerender_url;
889 915
890 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL", 916 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL",
891 prerender_url, "&" + loader_query_); 917 prerender_url, "&" + loader_query_);
892 GURL::Replacements loader_replacements; 918 GURL::Replacements loader_replacements;
893 if (!loader_host_override_.empty()) 919 if (!loader_host_override_.empty())
894 loader_replacements.SetHostStr(loader_host_override_); 920 loader_replacements.SetHostStr(loader_host_override_);
895 loader_url = loader_url.ReplaceComponents(loader_replacements); 921 loader_url = loader_url.ReplaceComponents(loader_replacements);
896 922
897 std::vector<std::unique_ptr<TestPrerender>> prerenders = 923 std::vector<std::unique_ptr<TestPrerender>> prerenders =
898 NavigateWithPrerenders(loader_url, expected_final_status_queue); 924 NavigateWithPrerenders(loader_url, expected_final_status_queue);
899 prerenders[0]->WaitForLoads(expected_number_of_loads); 925 prerenders[0]->WaitForLoads(expected_number_of_loads);
900 926
927 if (!mid_load_clock_tick_advance_.is_zero()) {
928 EXPECT_TRUE(mid_load_clock_);
929 mid_load_clock_->Advance(mid_load_clock_tick_advance_);
930 }
931
901 FinalStatus expected_final_status = expected_final_status_queue.front(); 932 FinalStatus expected_final_status = expected_final_status_queue.front();
902 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 933 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) {
903 // The prerender will abort on its own. Assert it does so correctly. 934 // The prerender will abort on its own. Assert it does so correctly.
904 prerenders[0]->WaitForStop(); 935 prerenders[0]->WaitForStop();
905 EXPECT_FALSE(prerenders[0]->contents()); 936 EXPECT_FALSE(prerenders[0]->contents());
906 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 937 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0));
907 } else { 938 } else {
908 // Otherwise, check that it prerendered correctly. 939 // Otherwise, check that it prerendered correctly.
909 TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 940 TestPrerenderContents* prerender_contents = prerenders[0]->contents();
910 CHECK(prerender_contents); 941 CHECK(prerender_contents);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 } 1014 }
984 } 1015 }
985 1016
986 GURL dest_url_; 1017 GURL dest_url_;
987 bool call_javascript_; 1018 bool call_javascript_;
988 bool check_load_events_; 1019 bool check_load_events_;
989 std::string loader_host_override_; 1020 std::string loader_host_override_;
990 std::string loader_path_; 1021 std::string loader_path_;
991 std::string loader_query_; 1022 std::string loader_query_;
992 base::test::ScopedFeatureList feature_list_; 1023 base::test::ScopedFeatureList feature_list_;
1024 base::TimeDelta mid_load_clock_tick_advance_;
1025 base::SimpleTestTickClock* mid_load_clock_;
993 }; 1026 };
994 1027
995 // Checks that a page is correctly prerendered in the case of a 1028 // Checks that a page is correctly prerendered in the case of a
996 // <link rel=prerender> tag and then loaded into a tab in response to a 1029 // <link rel=prerender> tag and then loaded into a tab in response to a
997 // navigation. 1030 // navigation.
998 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 1031 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
1032 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1033 test_utils::FirstContentfulPaintManagerWaiter::Create(
1034 GetPrerenderManager());
999 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 1035 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
1000 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 1036 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0));
1001 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1037 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1002 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 1038 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0);
1003 histogram_tester().ExpectTotalCount( 1039 histogram_tester().ExpectTotalCount(
1004 "Prerender.none_PerceivedPLTMatchedComplete", 0); 1040 "Prerender.none_PerceivedPLTMatchedComplete", 0);
1005 histogram_tester().ExpectTotalCount( 1041 histogram_tester().ExpectTotalCount(
1006 "Prerender.websame_PrerenderNotSwappedInPLT", 1); 1042 "Prerender.websame_PrerenderNotSwappedInPLT", 1);
1007 1043
1008 ChannelDestructionWatcher channel_close_watcher; 1044 ChannelDestructionWatcher channel_close_watcher;
1009 channel_close_watcher.WatchChannel( 1045 channel_close_watcher.WatchChannel(
1010 GetActiveWebContents()->GetRenderProcessHost()); 1046 GetActiveWebContents()->GetRenderProcessHost());
1011 NavigateToDestURL(); 1047 NavigateToDestURL();
1012 channel_close_watcher.WaitForChannelClose(); 1048 channel_close_watcher.WaitForChannelClose();
1049 fcp_waiter->Wait();
1050
1051 for (const auto& counts :
1052 histogram_tester().GetTotalCountsForPrefix("Prerender.")) {
1053 DVLOG(0) << "%% counts " << counts.first << ": " << counts.second;
1054 }
1013 1055
1014 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 1056 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1);
1015 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1057 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched",
1016 1); 1058 1);
1017 histogram_tester().ExpectTotalCount( 1059 histogram_tester().ExpectTotalCount(
1018 "Prerender.websame_PerceivedPLTMatchedComplete", 1); 1060 "Prerender.websame_PerceivedPLTMatchedComplete", 1);
1061 histogram_tester().ExpectTotalCount(
1062 "Prerender.websame_PerceivedTTFCP.Visible", 1);
1063 histogram_tester().ExpectTotalCount(
1064 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 1);
1019 1065
1020 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 1066 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
1021 } 1067 }
1022 1068
1023 // Checks that cross-domain prerenders emit the correct histograms. 1069 // Checks that cross-domain prerenders emit the correct histograms.
1024 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 1070 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) {
1071 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1072 test_utils::FirstContentfulPaintManagerWaiter::Create(
1073 GetPrerenderManager());
1025 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), 1074 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"),
1026 FINAL_STATUS_USED, 1); 1075 FINAL_STATUS_USED, 1);
1027 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1076 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1028 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 1077 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0);
1029 histogram_tester().ExpectTotalCount( 1078 histogram_tester().ExpectTotalCount(
1030 "Prerender.none_PerceivedPLTMatchedComplete", 0); 1079 "Prerender.none_PerceivedPLTMatchedComplete", 0);
1031 histogram_tester().ExpectTotalCount( 1080 histogram_tester().ExpectTotalCount(
1032 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 1081 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
1033 1082
1034 NavigateToDestURL(); 1083 NavigateToDestURL();
1084 fcp_waiter->Wait();
1085
1035 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 1086 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1);
1036 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1087 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched",
1037 1); 1088 1);
1038 histogram_tester().ExpectTotalCount( 1089 histogram_tester().ExpectTotalCount(
1039 "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 1090 "Prerender.webcross_PerceivedPLTMatchedComplete", 1);
1091 histogram_tester().ExpectTotalCount(
1092 "Prerender.webcross_PerceivedTTFCP.Visible", 1);
1040 } 1093 }
1041 1094
1042 // Checks that pending prerenders launch and receive proper event treatment. 1095 // Checks that pending prerenders launch and receive proper event treatment.
1043 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 1096 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1044 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( 1097 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL(
1045 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); 1098 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1);
1046 1099
1047 // Navigate to the prerender. 1100 // Navigate to the prerender.
1048 std::unique_ptr<TestPrerender> prerender2 = 1101 std::unique_ptr<TestPrerender> prerender2 =
1049 ExpectPrerender(FINAL_STATUS_USED); 1102 ExpectPrerender(FINAL_STATUS_USED);
(...skipping 2141 matching lines...) Expand 10 before | Expand all | Expand 10 after
3191 done_url, empty_file, done_counter.AsWeakPtr())); 3244 done_url, empty_file, done_counter.AsWeakPtr()));
3192 // Loading may finish or be interrupted. The final result is important only. 3245 // Loading may finish or be interrupted. The final result is important only.
3193 DisableLoadEventCheck(); 3246 DisableLoadEventCheck();
3194 // TestPrenderContents is always created before the Autosignin JS can run, so 3247 // TestPrenderContents is always created before the Autosignin JS can run, so
3195 // waiting for PrerenderContents to stop should be reliable. 3248 // waiting for PrerenderContents to stop should be reliable.
3196 PrerenderTestURL("/password/autosignin.html", 3249 PrerenderTestURL("/password/autosignin.html",
3197 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3250 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3198 EXPECT_EQ(0, done_counter.count()); 3251 EXPECT_EQ(0, done_counter.count());
3199 } 3252 }
3200 3253
3254 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3255 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3256 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3257 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3258
3259 base::TimeTicks load_start = clock->NowTicks();
3260 clock->Advance(base::TimeDelta::FromSeconds(1));
3261 NavigateToDestURL();
3262
3263 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3264 GetPrerenderManager(), GetActiveWebContents());
3265 observer.SetNavigationStartTo(load_start);
3266
3267 page_load_metrics::PageLoadTiming timing;
3268 timing.navigation_start = base::Time::FromDoubleT(1);
3269 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3270 page_load_metrics::PageLoadMetricsObserverTestHarness::
3271 PopulateRequiredTimingFields(&timing);
3272 observer.OnFirstContentfulPaint(
3273 timing,
3274 page_load_metrics::PageLoadExtraInfo(
3275 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3276 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3277 0, 0, page_load_metrics::PageLoadMetadata()));
3278
3279 histogram_tester().ExpectTotalCount(
3280 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3281 histogram_tester().ExpectUniqueSample(
3282 "Prerender.websame_PerceivedTTFCP.Visible", 1654, 1);
3283 }
3284
3285 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3286 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3287 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3288
3289 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3290 DisableJavascriptCalls();
3291 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3292
3293 // This prerender cancels and reuses the first.
3294 clock->Advance(base::TimeDelta::FromSeconds(1));
3295 base::TimeTicks load_start = clock->NowTicks();
3296 EnableJavascriptCalls();
3297 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3298 clock->Advance(base::TimeDelta::FromSeconds(1));
3299
3300 NavigateToDestURL();
3301 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3302 GetPrerenderManager(), GetActiveWebContents());
3303 observer.SetNavigationStartTo(load_start);
3304
3305 page_load_metrics::PageLoadTiming timing;
3306 timing.navigation_start = base::Time::FromDoubleT(1);
3307 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3308 page_load_metrics::PageLoadMetricsObserverTestHarness::
3309 PopulateRequiredTimingFields(&timing);
3310 observer.OnFirstContentfulPaint(
3311 timing,
3312 page_load_metrics::PageLoadExtraInfo(
3313 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3314 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3315 0, 0, page_load_metrics::PageLoadMetadata()));
3316
3317 histogram_tester().ExpectTotalCount(
3318 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3319 // If the first prerender had been used, the perceived TTFCP would have been
3320 // under a second: 2362ms - 2 sec worth of Advance().
3321 histogram_tester().ExpectUniqueSample(
3322 "Prerender.websame_PerceivedTTFCP.Visible", 1361, 1);
3323 }
3324
3325 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3326 FirstContentfulPaintTimingTimeout) {
3327 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3328 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3329
3330 // Make the first prerender time out.
3331 base::TimeDelta time_out_delta =
3332 GetPrerenderManager()->config().time_to_live +
3333 base::TimeDelta::FromSeconds(10);
3334 SetMidLoadClockAdvance(clock, time_out_delta);
3335
3336 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3337 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3338
3339 ClearMidLoadClock();
3340 base::TimeTicks load_start = clock->NowTicks();
3341 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3342
3343 clock->Advance(base::TimeDelta::FromSeconds(1));
3344 NavigateToDestURL();
3345
3346 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3347 GetPrerenderManager(), GetActiveWebContents());
3348 observer.SetNavigationStartTo(load_start);
3349
3350 page_load_metrics::PageLoadTiming timing;
3351 timing.navigation_start = base::Time::FromDoubleT(1);
3352 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3353 page_load_metrics::PageLoadMetricsObserverTestHarness::
3354 PopulateRequiredTimingFields(&timing);
3355 observer.OnFirstContentfulPaint(
3356 timing,
3357 page_load_metrics::PageLoadExtraInfo(
3358 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3359 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3360 0, 0, page_load_metrics::PageLoadMetadata()));
3361
3362 histogram_tester().ExpectTotalCount(
3363 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3364 // If the timed out had been used, the perceived TTFCP would have been
3365 // negative.
3366 histogram_tester().ExpectUniqueSample(
3367 "Prerender.websame_PerceivedTTFCP.Visible", 1361, 1);
3368 }
3369
3370 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3371 FirstContentfulPaintTimingNoCommit) {
3372 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3373 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3374
3375 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3376 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3377 base::FilePath(),
3378 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3379
3380 base::RunLoop prerender_start_loop;
3381 BrowserThread::PostTask(
3382 BrowserThread::IO, FROM_HERE,
3383 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3384 prerender_start_loop.QuitClosure()));
3385 DisableJavascriptCalls();
3386 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3387 prerender_start_loop.Run();
3388
3389 clock->Advance(base::TimeDelta::FromSeconds(1));
3390 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3391
3392 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3393 GetPrerenderManager(), GetActiveWebContents());
3394 observer.SetNavigationStartTo(clock->NowTicks());
3395
3396 page_load_metrics::PageLoadTiming timing;
3397 timing.navigation_start = base::Time::FromDoubleT(1);
3398 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3399 page_load_metrics::PageLoadMetricsObserverTestHarness::
3400 PopulateRequiredTimingFields(&timing);
3401 observer.OnFirstContentfulPaint(
3402 timing,
3403 page_load_metrics::PageLoadExtraInfo(
3404 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3405 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3406 0, 0, page_load_metrics::PageLoadMetadata()));
3407
3408 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCP.Visible",
3409 0);
3410 histogram_tester().ExpectTotalCount(
3411 "Prerender.none_PerceivedTTFCPRecorded.Visible", 1);
3412
3413 // Check that the prerender didn't happen with a defined origin.
3414 histogram_tester().ExpectTotalCount(
3415 "Prerender.websame_PerceivedTTFCP.Visible", 0);
3416 histogram_tester().ExpectTotalCount(
3417 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0);
3418
3419 // A FCP is fired by the observer, but the manager should detect that the
3420 // perceived time is not set and so update the following histogram.
3421 histogram_tester().ExpectUniqueSample(
3422 "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1);
3423 }
3424
3425 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3426 FirstContentfulPaintTimingTwoPages) {
3427 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3428 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3429
3430 DisableJavascriptCalls();
3431 // First prerender a different page from the usual target.
3432 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3433
3434 clock->Advance(base::TimeDelta::FromSeconds(1));
3435 base::TimeTicks load_start = clock->NowTicks();
3436 EnableJavascriptCalls();
3437 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3438
3439 clock->Advance(base::TimeDelta::FromSeconds(1));
3440 NavigateToDestURL();
3441
3442 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3443 GetPrerenderManager(), GetActiveWebContents());
3444 observer.SetNavigationStartTo(load_start);
3445
3446 page_load_metrics::PageLoadTiming timing;
3447 timing.navigation_start = base::Time::FromDoubleT(1);
3448 // The FCP time should end up on the edge of the bucket.
3449 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3450 page_load_metrics::PageLoadMetricsObserverTestHarness::
3451 PopulateRequiredTimingFields(&timing);
3452 observer.OnFirstContentfulPaint(
3453 timing,
3454 page_load_metrics::PageLoadExtraInfo(
3455 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3456 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3457 0, 0, page_load_metrics::PageLoadMetadata()));
3458
3459 histogram_tester().ExpectTotalCount(
3460 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3461 histogram_tester().ExpectUniqueSample(
3462 "Prerender.websame_PerceivedTTFCP.Visible", 1654, 1);
3463 }
3464
3465 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) {
3466 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3467 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3468 base::TimeTicks load_start = clock->NowTicks();
3469 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3470
3471 clock->Advance(base::TimeDelta::FromSeconds(1));
3472 NavigateToDestURL();
3473
3474 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3475 GetPrerenderManager(), GetActiveWebContents());
3476 observer.SetNavigationStartTo(load_start);
3477
3478 page_load_metrics::PageLoadExtraInfo extra_info(
3479 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3480 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(), 0, 0,
3481 page_load_metrics::PageLoadMetadata());
3482 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3483 observer.OnHidden(page_load_metrics::PageLoadTiming(), extra_info));
3484
3485 page_load_metrics::PageLoadTiming timing;
3486 timing.navigation_start = base::Time::FromDoubleT(1);
3487 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3488 page_load_metrics::PageLoadMetricsObserverTestHarness::
3489 PopulateRequiredTimingFields(&timing);
3490 observer.OnFirstContentfulPaint(timing, extra_info);
3491
3492 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP.Hidden",
3493 1);
3494 histogram_tester().ExpectUniqueSample(
3495 "Prerender.websame_PerceivedTTFCP.Hidden", 1654, 1);
3496 }
3497
3498 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3499 FirstContentfulPaintHiddenNoCommit) {
3500 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3501 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3502
3503 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3504 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3505 base::FilePath(),
3506 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3507
3508 base::RunLoop prerender_start_loop;
3509 BrowserThread::PostTask(
3510 BrowserThread::IO, FROM_HERE,
3511 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3512 prerender_start_loop.QuitClosure()));
3513 DisableJavascriptCalls();
3514 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3515 prerender_start_loop.Run();
3516
3517 clock->Advance(base::TimeDelta::FromSeconds(1));
3518 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3519
3520 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3521 GetPrerenderManager(), GetActiveWebContents());
3522 observer.SetNavigationStartTo(clock->NowTicks());
3523
3524 page_load_metrics::PageLoadExtraInfo extra_info(
3525 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3526 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(), 0, 0,
3527 page_load_metrics::PageLoadMetadata());
3528 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3529 observer.OnHidden(page_load_metrics::PageLoadTiming(), extra_info));
3530
3531 page_load_metrics::PageLoadTiming timing;
3532 timing.navigation_start = base::Time::FromDoubleT(1);
3533 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3534 page_load_metrics::PageLoadMetricsObserverTestHarness::
3535 PopulateRequiredTimingFields(&timing);
3536 observer.OnFirstContentfulPaint(timing, extra_info);
3537
3538 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCP.Hidden",
3539 0);
3540 histogram_tester().ExpectTotalCount(
3541 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1);
3542
3543 // Check that the prerender didn't happen with a defined origin.
3544 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP.Hidden",
3545 0);
3546 histogram_tester().ExpectTotalCount(
3547 "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0);
3548
3549 // A FCP is fired by the observer, but the manager should detect that the
3550 // perceived time is not set and so update the following histogram.
3551 histogram_tester().ExpectUniqueSample(
3552 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1);
3553 }
3554
3201 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3555 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3202 public: 3556 public:
3203 void SetUpOnMainThread() override { 3557 void SetUpOnMainThread() override {
3204 Profile* normal_profile = current_browser()->profile(); 3558 Profile* normal_profile = current_browser()->profile();
3205 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3559 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3206 PrerenderBrowserTest::SetUpOnMainThread(); 3560 PrerenderBrowserTest::SetUpOnMainThread();
3207 } 3561 }
3208 }; 3562 };
3209 3563
3210 // Checks that prerendering works in incognito mode. 3564 // Checks that prerendering works in incognito mode.
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 browser()->tab_strip_model()->GetActiveWebContents(); 3700 browser()->tab_strip_model()->GetActiveWebContents();
3347 bool display_test_result = false; 3701 bool display_test_result = false;
3348 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3702 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3349 "DidDisplayReallyPass()", 3703 "DidDisplayReallyPass()",
3350 &display_test_result)); 3704 &display_test_result));
3351 ASSERT_TRUE(display_test_result); 3705 ASSERT_TRUE(display_test_result);
3352 } 3706 }
3353 #endif // !defined(DISABLE_NACL) 3707 #endif // !defined(DISABLE_NACL)
3354 3708
3355 } // namespace prerender 3709 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698