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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: Generalize internal histogram function name 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 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3313 GetPrerenderManager(), GetActiveWebContents());
3314 observer.SetNavigationStartMilliseconds(1000);
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(
3328 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3329 histogram_tester().ExpectUniqueSample(
3330 "Prerender.websame_PerceivedTTFCP.Visible", 1654, 1);
3331 }
3332
3333 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3334 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3335 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3336
3337 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3338 DisableJavascriptCalls();
3339 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3340
3341 // This prerender cancels and reuses the first.
3342 clock->Advance(base::TimeDelta::FromSeconds(1));
3343 EnableJavascriptCalls();
3344 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3345 clock->Advance(base::TimeDelta::FromSeconds(1));
3346 NavigateToDestURL();
3347
3348 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3349 GetPrerenderManager(), GetActiveWebContents());
3350 observer.SetNavigationStartMilliseconds(2000);
3351
3352 page_load_metrics::PageLoadTiming timing;
3353 timing.navigation_start = base::Time::FromDoubleT(1);
3354 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3355 page_load_metrics::PageLoadMetricsObserverTestHarness::
3356 PopulateRequiredTimingFields(&timing);
3357 observer.OnFirstContentfulPaint(
3358 timing,
3359 page_load_metrics::PageLoadExtraInfo(
3360 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3361 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3362 0, 0, page_load_metrics::PageLoadMetadata()));
3363
3364 histogram_tester().ExpectTotalCount(
3365 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3366 // If the first prerender had been used, the perceived TTFCP would have been
3367 // under a second: 2362ms - 2 sec worth of Advance().
3368 histogram_tester().ExpectUniqueSample(
3369 "Prerender.websame_PerceivedTTFCP.Visible", 1361, 1);
3370 }
3371
3372 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3373 FirstContentfulPaintTimingTimeout) {
3374 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3375 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3376
3377 // Make the first prerender time out.
3378 base::TimeDelta time_out_delta =
3379 GetPrerenderManager()->config().time_to_live +
3380 base::TimeDelta::FromSeconds(10);
3381 SetMidLoadClockAdvance(clock, time_out_delta);
3382
3383 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3384 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3385
3386 ClearMidLoadClock();
3387 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3388 clock->Advance(base::TimeDelta::FromSeconds(1));
3389 NavigateToDestURL();
3390
3391 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3392 GetPrerenderManager(), GetActiveWebContents());
3393 observer.SetNavigationStartFromZero(time_out_delta +
pasko 2016/11/21 14:44:36 This is the only callsite for this function, and c
mattcary 2016/11/21 16:13:37 No, it needs to add in the time_out_delta to the 1
mattcary 2016/11/22 08:37:53 Actually, it occurred to me that I should just set
3394 base::TimeDelta::FromSeconds(1));
3395
3396 page_load_metrics::PageLoadTiming timing;
3397 timing.navigation_start = base::Time::FromDoubleT(1);
3398 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
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(
3409 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3410 // If the timed out had been used, the perceived TTFCP would have been
3411 // negative.
3412 histogram_tester().ExpectUniqueSample(
3413 "Prerender.websame_PerceivedTTFCP.Visible", 1361, 1);
3414 }
3415
3416 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3417 FirstContentfulPaintTimingNoCommit) {
3418 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3419 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3420
3421 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3422 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3423 base::FilePath(),
3424 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3425
3426 base::RunLoop prerender_start_loop;
3427 BrowserThread::PostTask(
3428 BrowserThread::IO, FROM_HERE,
3429 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3430 prerender_start_loop.QuitClosure()));
3431 DisableJavascriptCalls();
3432 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3433 prerender_start_loop.Run();
3434
3435 clock->Advance(base::TimeDelta::FromSeconds(1));
3436
3437 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3438
3439 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3440 GetPrerenderManager(), GetActiveWebContents());
3441 observer.SetNavigationStartMilliseconds(1000);
3442
3443 page_load_metrics::PageLoadTiming timing;
3444 timing.navigation_start = base::Time::FromDoubleT(1);
3445 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3446 page_load_metrics::PageLoadMetricsObserverTestHarness::
3447 PopulateRequiredTimingFields(&timing);
3448 observer.OnFirstContentfulPaint(
3449 timing,
3450 page_load_metrics::PageLoadExtraInfo(
3451 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3452 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3453 0, 0, page_load_metrics::PageLoadMetadata()));
3454
3455 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCP.Visible",
3456 0);
3457 histogram_tester().ExpectTotalCount(
3458 "Prerender.none_PerceivedTTFCPRecorded.Visible", 1);
3459
3460 // Check that the prerender didn't happen with a defined origin.
3461 histogram_tester().ExpectTotalCount(
3462 "Prerender.websame_PerceivedTTFCP.Visible", 0);
3463 histogram_tester().ExpectTotalCount(
3464 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0);
3465
3466 // A FCP is fired by the observer, but the manager should detect that the
3467 // perceived time is not set and so update the following histogram.
3468 histogram_tester().ExpectUniqueSample(
3469 "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1);
3470 }
3471
3472 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3473 FirstContentfulPaintTimingTwoPages) {
3474 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3475 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3476
3477 DisableJavascriptCalls();
3478 // First prerender a different page from the usual target.
3479 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3480
3481 clock->Advance(base::TimeDelta::FromSeconds(1));
3482 EnableJavascriptCalls();
3483 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3484
3485 clock->Advance(base::TimeDelta::FromSeconds(1));
3486 NavigateToDestURL();
3487
3488 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3489 GetPrerenderManager(), GetActiveWebContents());
3490 observer.SetNavigationStartMilliseconds(2000);
3491
3492 page_load_metrics::PageLoadTiming timing;
3493 timing.navigation_start = base::Time::FromDoubleT(1);
3494 // The FCP time should end up on the edge of the bucket.
3495 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3496 page_load_metrics::PageLoadMetricsObserverTestHarness::
3497 PopulateRequiredTimingFields(&timing);
3498 observer.OnFirstContentfulPaint(
3499 timing,
3500 page_load_metrics::PageLoadExtraInfo(
3501 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3502 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(),
3503 0, 0, page_load_metrics::PageLoadMetadata()));
3504
3505 histogram_tester().ExpectTotalCount(
3506 "Prerender.websame_PerceivedTTFCP.Visible", 1);
3507 histogram_tester().ExpectUniqueSample(
3508 "Prerender.websame_PerceivedTTFCP.Visible", 1654, 1);
3509 }
3510
3511 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) {
3512 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3513 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3514 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3515 clock->Advance(base::TimeDelta::FromSeconds(1));
3516 NavigateToDestURL();
3517 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3518 GetPrerenderManager(), GetActiveWebContents());
3519 observer.SetNavigationStartMilliseconds(1000);
3520 page_load_metrics::PageLoadExtraInfo extra_info(
3521 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3522 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(), 0, 0,
3523 page_load_metrics::PageLoadMetadata());
3524
3525 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3526 observer.OnHidden(page_load_metrics::PageLoadTiming(), extra_info));
3527
3528 page_load_metrics::PageLoadTiming timing;
3529 timing.navigation_start = base::Time::FromDoubleT(1);
3530 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3531 page_load_metrics::PageLoadMetricsObserverTestHarness::
3532 PopulateRequiredTimingFields(&timing);
3533 observer.OnFirstContentfulPaint(timing, extra_info);
3534
3535 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP.Hidden",
3536 1);
3537 histogram_tester().ExpectUniqueSample(
3538 "Prerender.websame_PerceivedTTFCP.Hidden", 1654, 1);
3539 }
3540
3541 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3542 FirstContentfulPaintHiddenNoCommit) {
3543 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3544 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3545
3546 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3547 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3548 base::FilePath(),
3549 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3550
3551 base::RunLoop prerender_start_loop;
3552 BrowserThread::PostTask(
3553 BrowserThread::IO, FROM_HERE,
3554 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3555 prerender_start_loop.QuitClosure()));
3556 DisableJavascriptCalls();
3557 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3558 prerender_start_loop.Run();
3559
3560 clock->Advance(base::TimeDelta::FromSeconds(1));
3561
3562 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3563
3564 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3565 GetPrerenderManager(), GetActiveWebContents());
3566 observer.SetNavigationStartMilliseconds(1000);
3567 page_load_metrics::PageLoadExtraInfo extra_info(
3568 base::TimeDelta(), base::TimeDelta(), false, false, dest_url(),
3569 dest_url(), page_load_metrics::ABORT_NONE, false, base::TimeDelta(), 0, 0,
3570 page_load_metrics::PageLoadMetadata());
3571 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3572 observer.OnHidden(page_load_metrics::PageLoadTiming(), extra_info));
3573
3574 page_load_metrics::PageLoadTiming timing;
3575 timing.navigation_start = base::Time::FromDoubleT(1);
3576 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3577 page_load_metrics::PageLoadMetricsObserverTestHarness::
3578 PopulateRequiredTimingFields(&timing);
3579 observer.OnFirstContentfulPaint(timing, extra_info);
3580
3581 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedTTFCP.Hidden",
3582 0);
3583 histogram_tester().ExpectTotalCount(
3584 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1);
3585
3586 // Check that the prerender didn't happen with a defined origin.
3587 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedTTFCP.Hidden",
3588 0);
3589 histogram_tester().ExpectTotalCount(
3590 "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0);
3591
3592 // A FCP is fired by the observer, but the manager should detect that the
3593 // perceived time is not set and so update the following histogram.
3594 histogram_tester().ExpectUniqueSample(
3595 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1);
3596 }
3597
3261 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3598 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3262 public: 3599 public:
3263 void SetUpOnMainThread() override { 3600 void SetUpOnMainThread() override {
3264 Profile* normal_profile = current_browser()->profile(); 3601 Profile* normal_profile = current_browser()->profile();
3265 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3602 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3266 PrerenderBrowserTest::SetUpOnMainThread(); 3603 PrerenderBrowserTest::SetUpOnMainThread();
3267 } 3604 }
3268 }; 3605 };
3269 3606
3270 // Checks that prerendering works in incognito mode. 3607 // 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(); 3743 browser()->tab_strip_model()->GetActiveWebContents();
3407 bool display_test_result = false; 3744 bool display_test_result = false;
3408 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3745 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3409 "DidDisplayReallyPass()", 3746 "DidDisplayReallyPass()",
3410 &display_test_result)); 3747 &display_test_result));
3411 ASSERT_TRUE(display_test_result); 3748 ASSERT_TRUE(display_test_result);
3412 } 3749 }
3413 #endif // !defined(DISABLE_NACL) 3750 #endif // !defined(DISABLE_NACL)
3414 3751
3415 } // namespace prerender 3752 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698