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