| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |