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

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

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

Powered by Google App Engine
This is Rietveld 408576698