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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: non-prerender page load metric check 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 histogram_tester().ExpectTotalCount(
1104 "PageLoad.DocumentTiming.NavigationToFirstLayout", 1);
Charlie Harrison 2016/12/23 14:33:18 Why is layout calculated for this page? A prerende
Charlie Harrison 2016/12/23 14:35:47 s/calculated/logged
mattcary 2016/12/23 14:43:29 It's for the page that starts off the prerender: P
1105
1106 // Histograms only emitted during the simple load which does not happen here.
1107 histogram_tester().ExpectTotalCount(
1108 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 0);
1109 histogram_tester().ExpectTotalCount(
1110 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 0);
1111 }
1112
1016 // Checks that cross-domain prerenders emit the correct histograms. 1113 // Checks that cross-domain prerenders emit the correct histograms.
1017 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 1114 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) {
1115 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1116 test_utils::FirstContentfulPaintManagerWaiter::Create(
1117 GetPrerenderManager());
1018 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), 1118 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"),
1019 FINAL_STATUS_USED, 1); 1119 FINAL_STATUS_USED, 1);
1020 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1120 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1021 histogram_tester().ExpectTotalCount( 1121 histogram_tester().ExpectTotalCount(
1022 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 1122 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
1023 1123
1024 NavigateToDestURL(); 1124 NavigateToDestURL();
1125 fcp_waiter->Wait();
1126
1025 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 1127 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1);
1128 histogram_tester().ExpectTotalCount(
1129 "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1026 } 1130 }
1027 1131
1028 // Checks that pending prerenders launch and receive proper event treatment. 1132 // Checks that pending prerenders launch and receive proper event treatment.
1029 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 1133 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1030 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( 1134 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL(
1031 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); 1135 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1);
1032 1136
1033 // Navigate to the prerender. 1137 // Navigate to the prerender.
1034 std::unique_ptr<TestPrerender> prerender2 = 1138 std::unique_ptr<TestPrerender> prerender2 =
1035 ExpectPrerender(FINAL_STATUS_USED); 1139 ExpectPrerender(FINAL_STATUS_USED);
(...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after
3146 done_url, empty_file, done_counter.AsWeakPtr())); 3250 done_url, empty_file, done_counter.AsWeakPtr()));
3147 // Loading may finish or be interrupted. The final result is important only. 3251 // Loading may finish or be interrupted. The final result is important only.
3148 DisableLoadEventCheck(); 3252 DisableLoadEventCheck();
3149 // TestPrenderContents is always created before the Autosignin JS can run, so 3253 // TestPrenderContents is always created before the Autosignin JS can run, so
3150 // waiting for PrerenderContents to stop should be reliable. 3254 // waiting for PrerenderContents to stop should be reliable.
3151 PrerenderTestURL("/password/autosignin.html", 3255 PrerenderTestURL("/password/autosignin.html",
3152 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3256 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3153 EXPECT_EQ(0, done_counter.count()); 3257 EXPECT_EQ(0, done_counter.count());
3154 } 3258 }
3155 3259
3260 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3261 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3262 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3263 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3264
3265 base::TimeTicks load_start = clock->NowTicks();
3266 clock->Advance(base::TimeDelta::FromSeconds(1));
3267 NavigateToDestURL();
3268
3269 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3270 GetActiveWebContents());
3271 observer.SetNavigationStartTicksForTesting(load_start);
3272
3273 page_load_metrics::PageLoadTiming timing;
3274 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3275 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3276 page_load_metrics::PageLoadMetricsObserverTestHarness::
3277 PopulateRequiredTimingFields(&timing);
3278 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3279
3280 histogram_tester().ExpectTotalCount(
3281 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3282 histogram_tester().ExpectUniqueSample(
3283 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3284 }
3285
3286 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3287 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3288 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3289
3290 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3291 // As this load will be canceled, it is not waited for, and hence no
3292 // javascript is executed.
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 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3305 GetActiveWebContents());
3306 observer.SetNavigationStartTicksForTesting(load_start);
3307
3308 page_load_metrics::PageLoadTiming timing;
3309 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3310 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3311 page_load_metrics::PageLoadMetricsObserverTestHarness::
3312 PopulateRequiredTimingFields(&timing);
3313 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3314
3315 histogram_tester().ExpectTotalCount(
3316 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3317 // If the first prerender had been used, the perceived TTFCP would have been
3318 // under a second: 2362ms - 2 sec worth of Advance().
3319 histogram_tester().ExpectUniqueSample(
3320 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3321 }
3322
3323 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3324 FirstContentfulPaintTimingTimeout) {
3325 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3326 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3327
3328 // Make the first prerender time out.
3329 base::TimeDelta time_out_delta =
3330 GetPrerenderManager()->config().time_to_live +
3331 base::TimeDelta::FromSeconds(10);
3332 SetMidLoadClockAdvance(clock, time_out_delta);
3333
3334 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3335 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3336
3337 ClearMidLoadClock();
3338 base::TimeTicks load_start = clock->NowTicks();
3339 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3340
3341 clock->Advance(base::TimeDelta::FromSeconds(1));
3342 NavigateToDestURL();
3343
3344 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3345 GetActiveWebContents());
3346 observer.SetNavigationStartTicksForTesting(load_start);
3347
3348 page_load_metrics::PageLoadTiming timing;
3349 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3350 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3351 page_load_metrics::PageLoadMetricsObserverTestHarness::
3352 PopulateRequiredTimingFields(&timing);
3353 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3354
3355 histogram_tester().ExpectTotalCount(
3356 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3357 // If the timed out had been used, the perceived TTFCP would have been
3358 // negative.
3359 histogram_tester().ExpectUniqueSample(
3360 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3361 }
3362
3363 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3364 FirstContentfulPaintTimingNoCommit) {
3365 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3366 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3367
3368 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3369 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3370 base::FilePath(),
3371 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3372
3373 base::RunLoop prerender_start_loop;
3374 BrowserThread::PostTask(
3375 BrowserThread::IO, FROM_HERE,
3376 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3377 prerender_start_loop.QuitClosure()));
3378 // As this load is uncommitted, it is not waited for, and hence no
3379 // javascript is executed.
3380 DisableJavascriptCalls();
3381 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3382 prerender_start_loop.Run();
3383
3384 clock->Advance(base::TimeDelta::FromSeconds(1));
3385 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3386
3387 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3388 GetActiveWebContents());
3389 observer.SetNavigationStartTicksForTesting(clock->NowTicks());
3390
3391 page_load_metrics::PageLoadTiming timing;
3392 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3393 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3394 page_load_metrics::PageLoadMetricsObserverTestHarness::
3395 PopulateRequiredTimingFields(&timing);
3396 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3397
3398 histogram_tester().ExpectTotalCount(
3399 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3400 histogram_tester().ExpectTotalCount(
3401 "Prerender.none_PerceivedTTFCPRecorded.Visible", 1);
3402
3403 // Check that the prerender didn't happen with a defined origin.
3404 histogram_tester().ExpectTotalCount(
3405 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3406 histogram_tester().ExpectTotalCount(
3407 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0);
3408
3409 // A FCP is fired by the observer, but as a swap did not occur the perceived
3410 // time cannot be calculated, and an unrecorded perceived FCP time histogram
3411 // entry is made.
3412 histogram_tester().ExpectUniqueSample(
3413 "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1);
3414 }
3415
3416 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3417 FirstContentfulPaintTimingTwoPages) {
3418 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3419 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3420
3421 // As this load will be canceled, it is not waited for, and hence no
3422 // javascript is executed.
3423 DisableJavascriptCalls();
3424 // First prerender a different page from the usual target.
3425 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3426
3427 clock->Advance(base::TimeDelta::FromSeconds(1));
3428 base::TimeTicks load_start = clock->NowTicks();
3429 EnableJavascriptCalls();
3430 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3431
3432 clock->Advance(base::TimeDelta::FromSeconds(1));
3433 NavigateToDestURL();
3434
3435 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3436 GetActiveWebContents());
3437 observer.SetNavigationStartTicksForTesting(load_start);
3438
3439 page_load_metrics::PageLoadTiming timing;
3440 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3441 // The FCP time should end up on the edge of the bucket.
3442 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3443 page_load_metrics::PageLoadMetricsObserverTestHarness::
3444 PopulateRequiredTimingFields(&timing);
3445 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3446
3447 histogram_tester().ExpectTotalCount(
3448 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3449 histogram_tester().ExpectUniqueSample(
3450 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3451 }
3452
3453 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) {
3454 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3455 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3456 base::TimeTicks load_start = clock->NowTicks();
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 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3467 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3468 GenericPageLoadExtraInfo(dest_url())));
3469
3470 page_load_metrics::PageLoadTiming timing;
3471 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3472 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3473 page_load_metrics::PageLoadMetricsObserverTestHarness::
3474 PopulateRequiredTimingFields(&timing);
3475 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3476
3477 histogram_tester().ExpectTotalCount(
3478 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1);
3479 histogram_tester().ExpectUniqueSample(
3480 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1654, 1);
3481 }
3482
3483 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3484 FirstContentfulPaintHiddenNoCommit) {
3485 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3486 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3487
3488 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3489 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3490 base::FilePath(),
3491 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3492
3493 base::RunLoop prerender_start_loop;
3494 BrowserThread::PostTask(
3495 BrowserThread::IO, FROM_HERE,
3496 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3497 prerender_start_loop.QuitClosure()));
3498 // As this load is uncommitted, it is not waited for, and hence no
3499 // javascript is executed.
3500 DisableJavascriptCalls();
3501 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3502 prerender_start_loop.Run();
3503
3504 clock->Advance(base::TimeDelta::FromSeconds(1));
3505 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3506
3507 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(),
3508 GetActiveWebContents());
3509 observer.SetNavigationStartTicksForTesting(clock->NowTicks());
3510
3511 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3512 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3513 GenericPageLoadExtraInfo(dest_url())));
3514
3515 page_load_metrics::PageLoadTiming timing;
3516 timing.navigation_start = base::Time::FromDoubleT(1); // Non-null time.
3517 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3518 page_load_metrics::PageLoadMetricsObserverTestHarness::
3519 PopulateRequiredTimingFields(&timing);
3520 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3521
3522 histogram_tester().ExpectTotalCount(
3523 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3524 histogram_tester().ExpectTotalCount(
3525 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1);
3526
3527 // Check that the prerender didn't happen with a defined origin.
3528 histogram_tester().ExpectTotalCount(
3529 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3530 histogram_tester().ExpectTotalCount(
3531 "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0);
3532
3533 // A FCP is fired by the observer, but the manager should detect that the
3534 // perceived time is not set and so update the following histogram.
3535 histogram_tester().ExpectUniqueSample(
3536 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1);
3537 }
3538
3156 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3539 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3157 public: 3540 public:
3158 void SetUpOnMainThread() override { 3541 void SetUpOnMainThread() override {
3159 Profile* normal_profile = current_browser()->profile(); 3542 Profile* normal_profile = current_browser()->profile();
3160 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3543 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3161 PrerenderBrowserTest::SetUpOnMainThread(); 3544 PrerenderBrowserTest::SetUpOnMainThread();
3162 } 3545 }
3163 }; 3546 };
3164 3547
3165 // Checks that prerendering works in incognito mode. 3548 // 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(); 3683 browser()->tab_strip_model()->GetActiveWebContents();
3301 bool display_test_result = false; 3684 bool display_test_result = false;
3302 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3685 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3303 "DidDisplayReallyPass()", 3686 "DidDisplayReallyPass()",
3304 &display_test_result)); 3687 &display_test_result));
3305 ASSERT_TRUE(display_test_result); 3688 ASSERT_TRUE(display_test_result);
3306 } 3689 }
3307 #endif // !defined(DISABLE_NACL) 3690 #endif // !defined(DISABLE_NACL)
3308 3691
3309 } // namespace prerender 3692 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/page_load_metrics/page_load_tracker.cc ('k') | chrome/browser/prerender/prerender_histograms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698