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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: cleanup Created 4 years, 1 month 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"
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 tab, 776 tab,
774 "window.domAutomationController.send(DidBackToOriginalPagePass())", 777 "window.domAutomationController.send(DidBackToOriginalPagePass())",
775 &js_result)); 778 &js_result));
776 EXPECT_TRUE(js_result); 779 EXPECT_TRUE(js_result);
777 } 780 }
778 781
779 void DisableJavascriptCalls() { 782 void DisableJavascriptCalls() {
780 call_javascript_ = false; 783 call_javascript_ = false;
781 } 784 }
782 785
786 void EnableJavascriptCalls() { call_javascript_ = true; }
787
783 void DisableLoadEventCheck() { 788 void DisableLoadEventCheck() {
784 check_load_events_ = false; 789 check_load_events_ = false;
785 } 790 }
786 791
787 const PrerenderLinkManager* GetPrerenderLinkManager() const { 792 const PrerenderLinkManager* GetPrerenderLinkManager() const {
788 PrerenderLinkManager* prerender_link_manager = 793 PrerenderLinkManager* prerender_link_manager =
789 PrerenderLinkManagerFactory::GetForProfile( 794 PrerenderLinkManagerFactory::GetForProfile(
790 current_browser()->profile()); 795 current_browser()->profile());
791 return prerender_link_manager; 796 return prerender_link_manager;
792 } 797 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 } 932 }
928 933
929 void AddPrerender(const GURL& url, int index) { 934 void AddPrerender(const GURL& url, int index) {
930 std::string javascript = base::StringPrintf( 935 std::string javascript = base::StringPrintf(
931 "AddPrerender('%s', %d)", url.spec().c_str(), index); 936 "AddPrerender('%s', %d)", url.spec().c_str(), index);
932 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 937 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame();
933 render_frame_host->ExecuteJavaScriptForTests( 938 render_frame_host->ExecuteJavaScriptForTests(
934 base::ASCIIToUTF16(javascript)); 939 base::ASCIIToUTF16(javascript));
935 } 940 }
936 941
942 base::SimpleTestTickClock* OverridePrerenderManagerTimeTicks() {
943 auto clock = base::MakeUnique<base::SimpleTestTickClock>();
944 auto clock_ptr = clock.get();
945 // The default zero time causes the prerender manager to do strange things.
946 clock->Advance(base::TimeDelta::FromSeconds(1));
947 GetPrerenderManager()->SetTickClockForTesting(std::move(clock));
948 return clock_ptr;
949 }
950
951 void SetMidLoadClockAdvance(base::SimpleTestTickClock* clock,
952 base::TimeDelta delta) {
953 mid_load_clock_ = clock;
954 mid_load_clock_tick_advance_ = delta;
955 }
956
957 void ClearMidLoadClock() {
958 mid_load_clock_tick_advance_ = base::TimeDelta();
959 mid_load_clock_ = nullptr;
960 }
961
937 private: 962 private:
938 // TODO(davidben): Remove this altogether so the tests don't globally assume 963 // TODO(davidben): Remove this altogether so the tests don't globally assume
939 // only one prerender. 964 // only one prerender.
940 TestPrerenderContents* GetPrerenderContents() const { 965 TestPrerenderContents* GetPrerenderContents() const {
941 return GetPrerenderContentsFor(dest_url_); 966 return GetPrerenderContentsFor(dest_url_);
942 } 967 }
943 968
944 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl( 969 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl(
945 const GURL& prerender_url, 970 const GURL& prerender_url,
946 const std::vector<FinalStatus>& expected_final_status_queue, 971 const std::vector<FinalStatus>& expected_final_status_queue,
947 int expected_number_of_loads) { 972 int expected_number_of_loads) {
948 dest_url_ = prerender_url; 973 dest_url_ = prerender_url;
949 974
950 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL", 975 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL",
951 prerender_url, "&" + loader_query_); 976 prerender_url, "&" + loader_query_);
952 GURL::Replacements loader_replacements; 977 GURL::Replacements loader_replacements;
953 if (!loader_host_override_.empty()) 978 if (!loader_host_override_.empty())
954 loader_replacements.SetHostStr(loader_host_override_); 979 loader_replacements.SetHostStr(loader_host_override_);
955 loader_url = loader_url.ReplaceComponents(loader_replacements); 980 loader_url = loader_url.ReplaceComponents(loader_replacements);
956 981
957 std::vector<std::unique_ptr<TestPrerender>> prerenders = 982 std::vector<std::unique_ptr<TestPrerender>> prerenders =
958 NavigateWithPrerenders(loader_url, expected_final_status_queue); 983 NavigateWithPrerenders(loader_url, expected_final_status_queue);
959 prerenders[0]->WaitForLoads(expected_number_of_loads); 984 prerenders[0]->WaitForLoads(expected_number_of_loads);
960 985
986 if (!mid_load_clock_tick_advance_.is_zero()) {
987 EXPECT_TRUE(mid_load_clock_);
988 mid_load_clock_->Advance(mid_load_clock_tick_advance_);
989 }
990
961 FinalStatus expected_final_status = expected_final_status_queue.front(); 991 FinalStatus expected_final_status = expected_final_status_queue.front();
962 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 992 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) {
963 // The prerender will abort on its own. Assert it does so correctly. 993 // The prerender will abort on its own. Assert it does so correctly.
964 prerenders[0]->WaitForStop(); 994 prerenders[0]->WaitForStop();
965 EXPECT_FALSE(prerenders[0]->contents()); 995 EXPECT_FALSE(prerenders[0]->contents());
966 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 996 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0));
967 } else { 997 } else {
968 // Otherwise, check that it prerendered correctly. 998 // Otherwise, check that it prerendered correctly.
969 TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 999 TestPrerenderContents* prerender_contents = prerenders[0]->contents();
970 CHECK(prerender_contents); 1000 CHECK(prerender_contents);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 } 1073 }
1044 } 1074 }
1045 1075
1046 GURL dest_url_; 1076 GURL dest_url_;
1047 bool call_javascript_; 1077 bool call_javascript_;
1048 bool check_load_events_; 1078 bool check_load_events_;
1049 std::string loader_host_override_; 1079 std::string loader_host_override_;
1050 std::string loader_path_; 1080 std::string loader_path_;
1051 std::string loader_query_; 1081 std::string loader_query_;
1052 base::test::ScopedFeatureList feature_list_; 1082 base::test::ScopedFeatureList feature_list_;
1083 base::TimeDelta mid_load_clock_tick_advance_;
1084 base::SimpleTestTickClock* mid_load_clock_;
1053 }; 1085 };
1054 1086
1055 // Checks that a page is correctly prerendered in the case of a 1087 // Checks that a page is correctly prerendered in the case of a
1056 // <link rel=prerender> tag and then loaded into a tab in response to a 1088 // <link rel=prerender> tag and then loaded into a tab in response to a
1057 // navigation. 1089 // navigation.
1058 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 1090 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
1091 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1092 test_utils::FirstContentfulPaintManagerWaiter::Create(
1093 GetPrerenderManager());
1059 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 1094 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
1060 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 1095 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0));
1061 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1096 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1062 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 1097 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0);
1063 histogram_tester().ExpectTotalCount( 1098 histogram_tester().ExpectTotalCount(
1064 "Prerender.none_PerceivedPLTMatchedComplete", 0); 1099 "Prerender.none_PerceivedPLTMatchedComplete", 0);
1065 histogram_tester().ExpectTotalCount( 1100 histogram_tester().ExpectTotalCount(
1066 "Prerender.websame_PrerenderNotSwappedInPLT", 1); 1101 "Prerender.websame_PrerenderNotSwappedInPLT", 1);
1067 1102
1068 ChannelDestructionWatcher channel_close_watcher; 1103 ChannelDestructionWatcher channel_close_watcher;
1069 channel_close_watcher.WatchChannel( 1104 channel_close_watcher.WatchChannel(
1070 GetActiveWebContents()->GetRenderProcessHost()); 1105 GetActiveWebContents()->GetRenderProcessHost());
1071 NavigateToDestURL(); 1106 NavigateToDestURL();
1072 channel_close_watcher.WaitForChannelClose(); 1107 channel_close_watcher.WaitForChannelClose();
1108 fcp_waiter->Wait();
1073 1109
1074 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 1110 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1);
1075 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched", 1111 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLTMatched",
1076 1); 1112 1);
1077 histogram_tester().ExpectTotalCount( 1113 histogram_tester().ExpectTotalCount(
1078 "Prerender.websame_PerceivedPLTMatchedComplete", 1); 1114 "Prerender.websame_PerceivedPLTMatchedComplete", 1);
1115 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP", 1);
1116 histogram_tester().ExpectTotalCount(
1117 "Prerender.websame_PerceivedTTFCPRecorded", 1);
1079 1118
1080 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 1119 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
1081 } 1120 }
1082 1121
1083 // Checks that cross-domain prerenders emit the correct histograms. 1122 // Checks that cross-domain prerenders emit the correct histograms.
1084 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 1123 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) {
1124 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1125 test_utils::FirstContentfulPaintManagerWaiter::Create(
1126 GetPrerenderManager());
1085 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), 1127 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"),
1086 FINAL_STATUS_USED, 1); 1128 FINAL_STATUS_USED, 1);
1087 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1129 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1088 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 1130 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0);
1089 histogram_tester().ExpectTotalCount( 1131 histogram_tester().ExpectTotalCount(
1090 "Prerender.none_PerceivedPLTMatchedComplete", 0); 1132 "Prerender.none_PerceivedPLTMatchedComplete", 0);
1091 histogram_tester().ExpectTotalCount( 1133 histogram_tester().ExpectTotalCount(
1092 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 1134 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
1093 1135
1094 NavigateToDestURL(); 1136 NavigateToDestURL();
1137 fcp_waiter->Wait();
1138
1095 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 1139 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1);
1096 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1140 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched",
1097 1); 1141 1);
1098 histogram_tester().ExpectTotalCount( 1142 histogram_tester().ExpectTotalCount(
1099 "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 1143 "Prerender.webcross_PerceivedPLTMatchedComplete", 1);
1144 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedTTFCP", 1);
1100 } 1145 }
1101 1146
1102 // Checks that pending prerenders launch and receive proper event treatment. 1147 // Checks that pending prerenders launch and receive proper event treatment.
1103 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 1148 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1104 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( 1149 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL(
1105 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); 1150 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1);
1106 1151
1107 // Navigate to the prerender. 1152 // Navigate to the prerender.
1108 std::unique_ptr<TestPrerender> prerender2 = 1153 std::unique_ptr<TestPrerender> prerender2 =
1109 ExpectPrerender(FINAL_STATUS_USED); 1154 ExpectPrerender(FINAL_STATUS_USED);
(...skipping 2141 matching lines...) Expand 10 before | Expand all | Expand 10 after
3251 done_url, empty_file, done_counter.AsWeakPtr())); 3296 done_url, empty_file, done_counter.AsWeakPtr()));
3252 // Loading may finish or be interrupted. The final result is important only. 3297 // Loading may finish or be interrupted. The final result is important only.
3253 DisableLoadEventCheck(); 3298 DisableLoadEventCheck();
3254 // TestPrenderContents is always created before the Autosignin JS can run, so 3299 // TestPrenderContents is always created before the Autosignin JS can run, so
3255 // waiting for PrerenderContents to stop should be reliable. 3300 // waiting for PrerenderContents to stop should be reliable.
3256 PrerenderTestURL("/password/autosignin.html", 3301 PrerenderTestURL("/password/autosignin.html",
3257 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3302 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3258 EXPECT_EQ(0, done_counter.count()); 3303 EXPECT_EQ(0, done_counter.count());
3259 } 3304 }
3260 3305
3306 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3307 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3308 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3309 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3310 clock->Advance(base::TimeDelta::FromSeconds(1));
3311 NavigateToDestURL();
3312 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3313 GetActiveWebContents());
3314
3315 page_load_metrics::PageLoadTiming timing;
3316 timing.navigation_start = base::Time::FromDoubleT(1);
3317 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3318 page_load_metrics::PageLoadMetricsObserverTestHarness::
3319 PopulateRequiredTimingFields(&timing);
3320 observer.OnFirstContentfulPaint(
3321 timing,
3322 page_load_metrics::PageLoadExtraInfo(
3323 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3324 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3325 0, 0, page_load_metrics::PageLoadMetadata()));
3326
3327 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP", 1);
3328 histogram_tester().ExpectUniqueSample("Prerender.websame_PerceivedTTFCP",
3329 1654, 1);
3330 }
3331
3332 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3333 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3334 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3335
3336 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3337 DisableJavascriptCalls();
3338 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3339
3340 // This prerender cancels and reuses the first.
3341 clock->Advance(base::TimeDelta::FromSeconds(1));
3342 EnableJavascriptCalls();
3343 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3344 clock->Advance(base::TimeDelta::FromSeconds(1));
3345 NavigateToDestURL();
3346
3347 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3348 GetActiveWebContents());
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("Prerender.websame_PerceivedTTFCP", 1);
3363 // If the first prerender had been used, the perceived TTFCP would have been
3364 // under a second: 2362ms - 2 sec worth of Advance().
3365 histogram_tester().ExpectUniqueSample("Prerender.websame_PerceivedTTFCP",
3366 1361, 1);
3367 }
3368
3369 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3370 FirstContentfulPaintTimingTimeout) {
3371 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3372 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3373
3374 // Make the first prerender time out.
3375 SetMidLoadClockAdvance(clock, GetPrerenderManager()->config().time_to_live +
3376 base::TimeDelta::FromSeconds(10));
3377
3378 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3379 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3380
3381 ClearMidLoadClock();
3382 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3383 clock->Advance(base::TimeDelta::FromSeconds(1));
3384 NavigateToDestURL();
3385
3386 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3387 GetActiveWebContents());
3388
3389 page_load_metrics::PageLoadTiming timing;
3390 timing.navigation_start = base::Time::FromDoubleT(1);
3391 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3392 page_load_metrics::PageLoadMetricsObserverTestHarness::
3393 PopulateRequiredTimingFields(&timing);
3394 observer.OnFirstContentfulPaint(
3395 timing,
3396 page_load_metrics::PageLoadExtraInfo(
3397 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3398 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3399 0, 0, page_load_metrics::PageLoadMetadata()));
3400
3401 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP", 1);
3402 // If the timed out had been used, the perceived TTFCP would have been
3403 // negative.
3404 histogram_tester().ExpectUniqueSample("Prerender.websame_PerceivedTTFCP",
3405 1361, 1);
3406 }
3407
3408 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3409 FirstContentfulPaintTimingNoCommit) {
3410 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3411 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3412
3413 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3414 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3415 base::FilePath(),
3416 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3417
3418 base::RunLoop prerender_start_loop;
3419 BrowserThread::PostTask(
3420 BrowserThread::IO, FROM_HERE,
3421 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3422 prerender_start_loop.QuitClosure()));
3423 DisableJavascriptCalls();
3424 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3425 prerender_start_loop.Run();
3426
3427 clock->Advance(base::TimeDelta::FromSeconds(1));
3428
3429 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3430
3431 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3432 GetActiveWebContents());
3433
3434 page_load_metrics::PageLoadTiming timing;
3435 timing.navigation_start = base::Time::FromDoubleT(1);
3436 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3437 page_load_metrics::PageLoadMetricsObserverTestHarness::
3438 PopulateRequiredTimingFields(&timing);
3439 observer.OnFirstContentfulPaint(
3440 timing,
3441 page_load_metrics::PageLoadExtraInfo(
3442 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3443 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3444 0, 0, page_load_metrics::PageLoadMetadata()));
3445
3446 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCP", 0);
3447 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCPRecorded",
3448 1);
3449
3450 // Check that the prerender didn't happen with a defined origin.
3451 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP", 0);
3452 histogram_tester().ExpectTotalCount(
3453 "Prerender.websame_PerceivedTTFCPRecorded", 0);
3454
3455 // A FCP is fired by the observer, but the manager should detect that the
3456 // perceived time is not set and so update the following histogram.
3457 histogram_tester().ExpectUniqueSample("Prerender.none_PerceivedTTFCPRecorded",
3458 0, 1);
3459 }
3460
3461 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3462 FirstContentfulPaintTimingTwoPages) {
3463 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3464 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3465
3466 DisableJavascriptCalls();
3467 // First prerender a different page from the usual target.
3468 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3469
3470 clock->Advance(base::TimeDelta::FromSeconds(1));
3471 EnableJavascriptCalls();
3472 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3473
3474 clock->Advance(base::TimeDelta::FromSeconds(1));
3475 NavigateToDestURL();
3476
3477 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3478 GetActiveWebContents());
3479 page_load_metrics::PageLoadTiming timing;
3480 timing.navigation_start = base::Time::FromDoubleT(1);
3481 // The FCP time should end up on the edge of the bucket.
3482 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3483 page_load_metrics::PageLoadMetricsObserverTestHarness::
3484 PopulateRequiredTimingFields(&timing);
3485 observer.OnFirstContentfulPaint(
3486 timing,
3487 page_load_metrics::PageLoadExtraInfo(
3488 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3489 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3490 0, 0, page_load_metrics::PageLoadMetadata()));
3491
3492 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP", 1);
3493 histogram_tester().ExpectUniqueSample("Prerender.websame_PerceivedTTFCP",
3494 1654, 1);
3495 }
3496
3261 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3497 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3262 public: 3498 public:
3263 void SetUpOnMainThread() override { 3499 void SetUpOnMainThread() override {
3264 Profile* normal_profile = current_browser()->profile(); 3500 Profile* normal_profile = current_browser()->profile();
3265 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3501 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3266 PrerenderBrowserTest::SetUpOnMainThread(); 3502 PrerenderBrowserTest::SetUpOnMainThread();
3267 } 3503 }
3268 }; 3504 };
3269 3505
3270 // Checks that prerendering works in incognito mode. 3506 // Checks that prerendering works in incognito mode.
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3406 browser()->tab_strip_model()->GetActiveWebContents(); 3642 browser()->tab_strip_model()->GetActiveWebContents();
3407 bool display_test_result = false; 3643 bool display_test_result = false;
3408 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3644 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3409 "DidDisplayReallyPass()", 3645 "DidDisplayReallyPass()",
3410 &display_test_result)); 3646 &display_test_result));
3411 ASSERT_TRUE(display_test_result); 3647 ASSERT_TRUE(display_test_result);
3412 } 3648 }
3413 #endif // !defined(DISABLE_NACL) 3649 #endif // !defined(DISABLE_NACL)
3414 3650
3415 } // namespace prerender 3651 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698