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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: clarify page load metric test Created 3 years, 12 months 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 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 private: 530 private:
527 DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient); 531 DISALLOW_COPY_AND_ASSIGN(SwapProcessesContentBrowserClient);
528 }; 532 };
529 533
530 base::FilePath GetTestPath(const std::string& file_name) { 534 base::FilePath GetTestPath(const std::string& file_name) {
531 return ui_test_utils::GetTestFilePath( 535 return ui_test_utils::GetTestFilePath(
532 base::FilePath(FILE_PATH_LITERAL("prerender")), 536 base::FilePath(FILE_PATH_LITERAL("prerender")),
533 base::FilePath().AppendASCII(file_name)); 537 base::FilePath().AppendASCII(file_name));
534 } 538 }
535 539
540 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo(
541 const GURL& dest_url) {
542 return page_load_metrics::PageLoadExtraInfo(
543 base::TimeDelta(), base::TimeDelta(), false,
544 page_load_metrics::UserInitiatedInfo::BrowserInitiated(), dest_url,
545 dest_url, page_load_metrics::ABORT_NONE,
546 page_load_metrics::UserInitiatedInfo::NotUserInitiated(),
547 base::TimeDelta(), 0, 0, page_load_metrics::PageLoadMetadata());
548 }
549
536 } // namespace 550 } // namespace
537 551
538 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { 552 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest {
539 public: 553 public:
540 PrerenderBrowserTest() 554 PrerenderBrowserTest()
541 : call_javascript_(true), 555 : call_javascript_(true),
542 check_load_events_(true), 556 check_load_events_(true),
543 loader_path_("/prerender/prerender_loader.html") {} 557 loader_path_("/prerender/prerender_loader.html") {}
544 558
545 ~PrerenderBrowserTest() override {} 559 ~PrerenderBrowserTest() override {}
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 tab, 727 tab,
714 "window.domAutomationController.send(DidBackToOriginalPagePass())", 728 "window.domAutomationController.send(DidBackToOriginalPagePass())",
715 &js_result)); 729 &js_result));
716 EXPECT_TRUE(js_result); 730 EXPECT_TRUE(js_result);
717 } 731 }
718 732
719 void DisableJavascriptCalls() { 733 void DisableJavascriptCalls() {
720 call_javascript_ = false; 734 call_javascript_ = false;
721 } 735 }
722 736
737 void EnableJavascriptCalls() { call_javascript_ = true; }
738
723 void DisableLoadEventCheck() { 739 void DisableLoadEventCheck() {
724 check_load_events_ = false; 740 check_load_events_ = false;
725 } 741 }
726 742
727 const PrerenderLinkManager* GetPrerenderLinkManager() const { 743 const PrerenderLinkManager* GetPrerenderLinkManager() const {
728 PrerenderLinkManager* prerender_link_manager = 744 PrerenderLinkManager* prerender_link_manager =
729 PrerenderLinkManagerFactory::GetForProfile( 745 PrerenderLinkManagerFactory::GetForProfile(
730 current_browser()->profile()); 746 current_browser()->profile());
731 return prerender_link_manager; 747 return prerender_link_manager;
732 } 748 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 883 }
868 884
869 void AddPrerender(const GURL& url, int index) { 885 void AddPrerender(const GURL& url, int index) {
870 std::string javascript = base::StringPrintf( 886 std::string javascript = base::StringPrintf(
871 "AddPrerender('%s', %d)", url.spec().c_str(), index); 887 "AddPrerender('%s', %d)", url.spec().c_str(), index);
872 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame(); 888 RenderFrameHost* render_frame_host = GetActiveWebContents()->GetMainFrame();
873 render_frame_host->ExecuteJavaScriptForTests( 889 render_frame_host->ExecuteJavaScriptForTests(
874 base::ASCIIToUTF16(javascript)); 890 base::ASCIIToUTF16(javascript));
875 } 891 }
876 892
893 base::SimpleTestTickClock* OverridePrerenderManagerTimeTicks() {
894 auto clock = base::MakeUnique<base::SimpleTestTickClock>();
895 auto clock_ptr = clock.get();
896 // The default zero time causes the prerender manager to do strange things.
897 clock->Advance(base::TimeDelta::FromSeconds(1));
898 GetPrerenderManager()->SetTickClockForTesting(std::move(clock));
899 return clock_ptr;
900 }
901
902 void SetMidLoadClockAdvance(base::SimpleTestTickClock* clock,
903 base::TimeDelta delta) {
904 mid_load_clock_ = clock;
905 mid_load_clock_tick_advance_ = delta;
906 }
907
908 void ClearMidLoadClock() {
909 mid_load_clock_tick_advance_ = base::TimeDelta();
910 mid_load_clock_ = nullptr;
911 }
912
877 private: 913 private:
878 // TODO(davidben): Remove this altogether so the tests don't globally assume 914 // TODO(davidben): Remove this altogether so the tests don't globally assume
879 // only one prerender. 915 // only one prerender.
880 TestPrerenderContents* GetPrerenderContents() const { 916 TestPrerenderContents* GetPrerenderContents() const {
881 return GetPrerenderContentsFor(dest_url_); 917 return GetPrerenderContentsFor(dest_url_);
882 } 918 }
883 919
884 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl( 920 std::vector<std::unique_ptr<TestPrerender>> PrerenderTestURLImpl(
885 const GURL& prerender_url, 921 const GURL& prerender_url,
886 const std::vector<FinalStatus>& expected_final_status_queue, 922 const std::vector<FinalStatus>& expected_final_status_queue,
887 int expected_number_of_loads) { 923 int expected_number_of_loads) {
888 dest_url_ = prerender_url; 924 dest_url_ = prerender_url;
889 925
890 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL", 926 GURL loader_url = ServeLoaderURL(loader_path_, "REPLACE_WITH_PRERENDER_URL",
891 prerender_url, "&" + loader_query_); 927 prerender_url, "&" + loader_query_);
892 GURL::Replacements loader_replacements; 928 GURL::Replacements loader_replacements;
893 if (!loader_host_override_.empty()) 929 if (!loader_host_override_.empty())
894 loader_replacements.SetHostStr(loader_host_override_); 930 loader_replacements.SetHostStr(loader_host_override_);
895 loader_url = loader_url.ReplaceComponents(loader_replacements); 931 loader_url = loader_url.ReplaceComponents(loader_replacements);
896 932
897 std::vector<std::unique_ptr<TestPrerender>> prerenders = 933 std::vector<std::unique_ptr<TestPrerender>> prerenders =
898 NavigateWithPrerenders(loader_url, expected_final_status_queue); 934 NavigateWithPrerenders(loader_url, expected_final_status_queue);
899 prerenders[0]->WaitForLoads(expected_number_of_loads); 935 prerenders[0]->WaitForLoads(expected_number_of_loads);
900 936
937 if (!mid_load_clock_tick_advance_.is_zero()) {
938 EXPECT_TRUE(mid_load_clock_);
939 mid_load_clock_->Advance(mid_load_clock_tick_advance_);
940 }
941
901 FinalStatus expected_final_status = expected_final_status_queue.front(); 942 FinalStatus expected_final_status = expected_final_status_queue.front();
902 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) { 943 if (ShouldAbortPrerenderBeforeSwap(expected_final_status)) {
903 // The prerender will abort on its own. Assert it does so correctly. 944 // The prerender will abort on its own. Assert it does so correctly.
904 prerenders[0]->WaitForStop(); 945 prerenders[0]->WaitForStop();
905 EXPECT_FALSE(prerenders[0]->contents()); 946 EXPECT_FALSE(prerenders[0]->contents());
906 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0)); 947 EXPECT_TRUE(DidReceivePrerenderStopEventForLinkNumber(0));
907 } else { 948 } else {
908 // Otherwise, check that it prerendered correctly. 949 // Otherwise, check that it prerendered correctly.
909 TestPrerenderContents* prerender_contents = prerenders[0]->contents(); 950 TestPrerenderContents* prerender_contents = prerenders[0]->contents();
910 CHECK(prerender_contents); 951 CHECK(prerender_contents);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 } 1024 }
984 } 1025 }
985 1026
986 GURL dest_url_; 1027 GURL dest_url_;
987 bool call_javascript_; 1028 bool call_javascript_;
988 bool check_load_events_; 1029 bool check_load_events_;
989 std::string loader_host_override_; 1030 std::string loader_host_override_;
990 std::string loader_path_; 1031 std::string loader_path_;
991 std::string loader_query_; 1032 std::string loader_query_;
992 base::test::ScopedFeatureList feature_list_; 1033 base::test::ScopedFeatureList feature_list_;
1034 base::TimeDelta mid_load_clock_tick_advance_;
1035 base::SimpleTestTickClock* mid_load_clock_;
993 }; 1036 };
994 1037
995 // Checks that a page is correctly prerendered in the case of a 1038 // 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 1039 // <link rel=prerender> tag and then loaded into a tab in response to a
997 // navigation. 1040 // navigation.
998 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { 1041 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) {
1042 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1043 test_utils::FirstContentfulPaintManagerWaiter::Create(
1044 GetPrerenderManager());
999 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); 1045 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
1000 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); 1046 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0));
1001 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1047 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1002 histogram_tester().ExpectTotalCount( 1048 histogram_tester().ExpectTotalCount(
1003 "Prerender.websame_PrerenderNotSwappedInPLT", 1); 1049 "Prerender.websame_PrerenderNotSwappedInPLT", 1);
1004 1050
1005 ChannelDestructionWatcher channel_close_watcher; 1051 ChannelDestructionWatcher channel_close_watcher;
1006 channel_close_watcher.WatchChannel( 1052 channel_close_watcher.WatchChannel(
1007 GetActiveWebContents()->GetRenderProcessHost()); 1053 GetActiveWebContents()->GetRenderProcessHost());
1008 NavigateToDestURL(); 1054 NavigateToDestURL();
1009 channel_close_watcher.WaitForChannelClose(); 1055 channel_close_watcher.WaitForChannelClose();
1056 fcp_waiter->Wait();
1010 1057
1011 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); 1058 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1);
1059 histogram_tester().ExpectTotalCount(
1060 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1061 histogram_tester().ExpectTotalCount(
1062 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 1);
1012 1063
1013 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); 1064 ASSERT_TRUE(IsEmptyPrerenderLinkManager());
1014 } 1065 }
1015 1066
1067 // Checks that the correct page load metrics observers are produced without a
1068 // prerender.
1069 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PageLoadMetricsSimple) {
1070 // The prefetch page is used as a simple page with a nonempty layout; no
1071 // prefetching is performed.
1072 test_utils::FirstContentfulPaintManagerWaiter* simple_fcp_waiter =
1073 test_utils::FirstContentfulPaintManagerWaiter::Create(
1074 GetPrerenderManager());
1075 ui_test_utils::NavigateToURL(
1076 current_browser(), src_server()->GetURL("/prerender/prefetch_page.html"));
1077 simple_fcp_waiter->Wait();
1078
1079 histogram_tester().ExpectTotalCount(
1080 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1);
1081 histogram_tester().ExpectTotalCount(
1082 "PageLoad.DocumentTiming.NavigationToFirstLayout", 1);
1083 histogram_tester().ExpectTotalCount(
1084 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 1);
1085
1086 // Histogram only emitted during a prerender, which should not happen here.
1087 histogram_tester().ExpectTotalCount(
1088 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
1089 }
1090
1091 // Checks that the correct page load metrics observers are produced with a
1092 // prerender.
1093 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PageLoadMetricsPrerender) {
1094 test_utils::FirstContentfulPaintManagerWaiter* prerender_fcp_waiter =
1095 test_utils::FirstContentfulPaintManagerWaiter::Create(
1096 GetPrerenderManager());
1097 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
1098 NavigateToDestURL();
1099 prerender_fcp_waiter->Wait();
1100
1101 histogram_tester().ExpectTotalCount(
1102 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1103
1104 // Histogram logged during the prefetch_loader.html load, but not during the
1105 // prerender.
1106 histogram_tester().ExpectTotalCount(
1107 "PageLoad.DocumentTiming.NavigationToFirstLayout", 1);
1108
1109 // Histograms only emitted during the simple load which does not happen here
1110 // (as prefetch_loader.html has an empty body, it does not generate a FCP).
1111 histogram_tester().ExpectTotalCount(
1112 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0);
1113 histogram_tester().ExpectTotalCount(
1114 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 0);
1115 }
1116
1016 // Checks that cross-domain prerenders emit the correct histograms. 1117 // Checks that cross-domain prerenders emit the correct histograms.
1017 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 1118 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) {
1119 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1120 test_utils::FirstContentfulPaintManagerWaiter::Create(
1121 GetPrerenderManager());
1018 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), 1122 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"),
1019 FINAL_STATUS_USED, 1); 1123 FINAL_STATUS_USED, 1);
1020 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1124 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1021 histogram_tester().ExpectTotalCount( 1125 histogram_tester().ExpectTotalCount(
1022 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 1126 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
1023 1127
1024 NavigateToDestURL(); 1128 NavigateToDestURL();
1129 fcp_waiter->Wait();
1130
1025 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 1131 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1);
1132 histogram_tester().ExpectTotalCount(
1133 "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1026 } 1134 }
1027 1135
1028 // Checks that pending prerenders launch and receive proper event treatment. 1136 // Checks that pending prerenders launch and receive proper event treatment.
1029 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 1137 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1030 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( 1138 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL(
1031 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); 1139 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1);
1032 1140
1033 // Navigate to the prerender. 1141 // Navigate to the prerender.
1034 std::unique_ptr<TestPrerender> prerender2 = 1142 std::unique_ptr<TestPrerender> prerender2 =
1035 ExpectPrerender(FINAL_STATUS_USED); 1143 ExpectPrerender(FINAL_STATUS_USED);
(...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after
3146 done_url, empty_file, done_counter.AsWeakPtr())); 3254 done_url, empty_file, done_counter.AsWeakPtr()));
3147 // Loading may finish or be interrupted. The final result is important only. 3255 // Loading may finish or be interrupted. The final result is important only.
3148 DisableLoadEventCheck(); 3256 DisableLoadEventCheck();
3149 // TestPrenderContents is always created before the Autosignin JS can run, so 3257 // TestPrenderContents is always created before the Autosignin JS can run, so
3150 // waiting for PrerenderContents to stop should be reliable. 3258 // waiting for PrerenderContents to stop should be reliable.
3151 PrerenderTestURL("/password/autosignin.html", 3259 PrerenderTestURL("/password/autosignin.html",
3152 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3260 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3153 EXPECT_EQ(0, done_counter.count()); 3261 EXPECT_EQ(0, done_counter.count());
3154 } 3262 }
3155 3263
3264 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3265 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3266 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3267 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3268
3269 base::TimeTicks load_start = clock->NowTicks();
3270 clock->Advance(base::TimeDelta::FromSeconds(1));
3271 NavigateToDestURL();
3272
3273 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3274 GetActiveWebContents());
3275 observer.SetNavigationStartTicksForTesting(load_start);
3276
3277 page_load_metrics::PageLoadTiming timing;
3278 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3279 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3280 page_load_metrics::PageLoadMetricsObserverTestHarness::
3281 PopulateRequiredTimingFields(&timing);
3282 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3283
3284 histogram_tester().ExpectTotalCount(
3285 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3286 histogram_tester().ExpectUniqueSample(
3287 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3288 }
3289
3290 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3291 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3292 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3293
3294 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3295 // As this load will be canceled, it is not waited for, and hence no
3296 // javascript is executed.
3297 DisableJavascriptCalls();
3298 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3299
3300 // This prerender cancels and reuses the first.
3301 clock->Advance(base::TimeDelta::FromSeconds(1));
3302 base::TimeTicks load_start = clock->NowTicks();
3303 EnableJavascriptCalls();
3304 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3305 clock->Advance(base::TimeDelta::FromSeconds(1));
3306
3307 NavigateToDestURL();
3308 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3309 GetActiveWebContents());
3310 observer.SetNavigationStartTicksForTesting(load_start);
3311
3312 page_load_metrics::PageLoadTiming timing;
3313 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3314 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3315 page_load_metrics::PageLoadMetricsObserverTestHarness::
3316 PopulateRequiredTimingFields(&timing);
3317 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3318
3319 histogram_tester().ExpectTotalCount(
3320 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3321 // If the first prerender had been used, the perceived TTFCP would have been
3322 // under a second: 2362ms - 2 sec worth of Advance().
3323 histogram_tester().ExpectUniqueSample(
3324 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3325 }
3326
3327 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3328 FirstContentfulPaintTimingTimeout) {
3329 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3330 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3331
3332 // Make the first prerender time out.
3333 base::TimeDelta time_out_delta =
3334 GetPrerenderManager()->config().time_to_live +
3335 base::TimeDelta::FromSeconds(10);
3336 SetMidLoadClockAdvance(clock, time_out_delta);
3337
3338 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3339 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3340
3341 ClearMidLoadClock();
3342 base::TimeTicks load_start = clock->NowTicks();
3343 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3344
3345 clock->Advance(base::TimeDelta::FromSeconds(1));
3346 NavigateToDestURL();
3347
3348 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3349 GetActiveWebContents());
3350 observer.SetNavigationStartTicksForTesting(load_start);
3351
3352 page_load_metrics::PageLoadTiming timing;
3353 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3354 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3355 page_load_metrics::PageLoadMetricsObserverTestHarness::
3356 PopulateRequiredTimingFields(&timing);
3357 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3358
3359 histogram_tester().ExpectTotalCount(
3360 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3361 // If the timed out had been used, the perceived TTFCP would have been
3362 // negative.
3363 histogram_tester().ExpectUniqueSample(
3364 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3365 }
3366
3367 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3368 FirstContentfulPaintTimingNoCommit) {
3369 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3370 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3371
3372 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3373 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3374 base::FilePath(),
3375 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3376
3377 base::RunLoop prerender_start_loop;
3378 BrowserThread::PostTask(
3379 BrowserThread::IO, FROM_HERE,
3380 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3381 prerender_start_loop.QuitClosure()));
3382 // As this load is uncommitted, it is not waited for, and hence no
3383 // javascript is executed.
3384 DisableJavascriptCalls();
3385 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3386 prerender_start_loop.Run();
3387
3388 clock->Advance(base::TimeDelta::FromSeconds(1));
3389 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3390
3391 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3392 GetActiveWebContents());
3393 observer.SetNavigationStartTicksForTesting(clock->NowTicks());
3394
3395 page_load_metrics::PageLoadTiming timing;
3396 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3397 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3398 page_load_metrics::PageLoadMetricsObserverTestHarness::
3399 PopulateRequiredTimingFields(&timing);
3400 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3401
3402 histogram_tester().ExpectTotalCount(
3403 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3404 histogram_tester().ExpectTotalCount(
3405 "Prerender.none_PerceivedTTFCPRecorded.Visible", 1);
3406
3407 // Check that the prerender didn't happen with a defined origin.
3408 histogram_tester().ExpectTotalCount(
3409 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3410 histogram_tester().ExpectTotalCount(
3411 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0);
3412
3413 // A FCP is fired by the observer, but as a swap did not occur the perceived
3414 // time cannot be calculated, and an unrecorded perceived FCP time histogram
3415 // entry is made.
3416 histogram_tester().ExpectUniqueSample(
3417 "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1);
3418 }
3419
3420 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3421 FirstContentfulPaintTimingTwoPages) {
3422 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3423 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3424
3425 // As this load will be canceled, it is not waited for, and hence no
3426 // javascript is executed.
3427 DisableJavascriptCalls();
3428 // First prerender a different page from the usual target.
3429 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3430
3431 clock->Advance(base::TimeDelta::FromSeconds(1));
3432 base::TimeTicks load_start = clock->NowTicks();
3433 EnableJavascriptCalls();
3434 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3435
3436 clock->Advance(base::TimeDelta::FromSeconds(1));
3437 NavigateToDestURL();
3438
3439 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3440 GetActiveWebContents());
3441 observer.SetNavigationStartTicksForTesting(load_start);
3442
3443 page_load_metrics::PageLoadTiming timing;
3444 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3445 // The FCP time should end up on the edge of the bucket.
3446 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3447 page_load_metrics::PageLoadMetricsObserverTestHarness::
3448 PopulateRequiredTimingFields(&timing);
3449 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3450
3451 histogram_tester().ExpectTotalCount(
3452 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3453 histogram_tester().ExpectUniqueSample(
3454 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3455 }
3456
3457 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) {
3458 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3459 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3460 base::TimeTicks load_start = clock->NowTicks();
3461 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3462
3463 clock->Advance(base::TimeDelta::FromSeconds(1));
3464 NavigateToDestURL();
3465
3466 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3467 GetActiveWebContents());
3468 observer.SetNavigationStartTicksForTesting(load_start);
3469
3470 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3471 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3472 GenericPageLoadExtraInfo(dest_url())));
3473
3474 page_load_metrics::PageLoadTiming timing;
3475 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3476 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3477 page_load_metrics::PageLoadMetricsObserverTestHarness::
3478 PopulateRequiredTimingFields(&timing);
3479 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3480
3481 histogram_tester().ExpectTotalCount(
3482 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1);
3483 histogram_tester().ExpectUniqueSample(
3484 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1654, 1);
3485 }
3486
3487 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3488 FirstContentfulPaintHiddenNoCommit) {
3489 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3490 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3491
3492 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3493 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3494 base::FilePath(),
3495 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3496
3497 base::RunLoop prerender_start_loop;
3498 BrowserThread::PostTask(
3499 BrowserThread::IO, FROM_HERE,
3500 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3501 prerender_start_loop.QuitClosure()));
3502 // As this load is uncommitted, it is not waited for, and hence no
3503 // javascript is executed.
3504 DisableJavascriptCalls();
3505 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3506 prerender_start_loop.Run();
3507
3508 clock->Advance(base::TimeDelta::FromSeconds(1));
3509 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3510
3511 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3512 GetActiveWebContents());
3513 observer.SetNavigationStartTicksForTesting(clock->NowTicks());
3514
3515 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3516 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3517 GenericPageLoadExtraInfo(dest_url())));
3518
3519 page_load_metrics::PageLoadTiming timing;
3520 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3521 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3522 page_load_metrics::PageLoadMetricsObserverTestHarness::
3523 PopulateRequiredTimingFields(&timing);
3524 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3525
3526 histogram_tester().ExpectTotalCount(
3527 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3528 histogram_tester().ExpectTotalCount(
3529 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1);
3530
3531 // Check that the prerender didn't happen with a defined origin.
3532 histogram_tester().ExpectTotalCount(
3533 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3534 histogram_tester().ExpectTotalCount(
3535 "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0);
3536
3537 // A FCP is fired by the observer, but the manager should detect that the
3538 // perceived time is not set and so update the following histogram.
3539 histogram_tester().ExpectUniqueSample(
3540 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1);
3541 }
3542
3156 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3543 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3157 public: 3544 public:
3158 void SetUpOnMainThread() override { 3545 void SetUpOnMainThread() override {
3159 Profile* normal_profile = current_browser()->profile(); 3546 Profile* normal_profile = current_browser()->profile();
3160 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3547 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3161 PrerenderBrowserTest::SetUpOnMainThread(); 3548 PrerenderBrowserTest::SetUpOnMainThread();
3162 } 3549 }
3163 }; 3550 };
3164 3551
3165 // Checks that prerendering works in incognito mode. 3552 // Checks that prerendering works in incognito mode.
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3300 browser()->tab_strip_model()->GetActiveWebContents(); 3687 browser()->tab_strip_model()->GetActiveWebContents();
3301 bool display_test_result = false; 3688 bool display_test_result = false;
3302 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3689 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3303 "DidDisplayReallyPass()", 3690 "DidDisplayReallyPass()",
3304 &display_test_result)); 3691 &display_test_result));
3305 ASSERT_TRUE(display_test_result); 3692 ASSERT_TRUE(display_test_result);
3306 } 3693 }
3307 #endif // !defined(DISABLE_NACL) 3694 #endif // !defined(DISABLE_NACL)
3308 3695
3309 } // namespace prerender 3696 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698