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

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

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

Powered by Google App Engine
This is Rietveld 408576698