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

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

Issue 2423383002: [Prerender] first contentful paint histograms. (Closed)
Patch Set: comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <deque> 6 #include <deque>
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ref_counted_memory.h" 17 #include "base/memory/ref_counted_memory.h"
18 #include "base/memory/scoped_vector.h" 18 #include "base/memory/scoped_vector.h"
19 #include "base/memory/weak_ptr.h" 19 #include "base/memory/weak_ptr.h"
20 #include "base/path_service.h" 20 #include "base/path_service.h"
21 #include "base/run_loop.h" 21 #include "base/run_loop.h"
22 #include "base/scoped_observer.h" 22 #include "base/scoped_observer.h"
23 #include "base/stl_util.h" 23 #include "base/stl_util.h"
24 #include "base/strings/string_split.h" 24 #include "base/strings/string_split.h"
25 #include "base/strings/string_util.h" 25 #include "base/strings/string_util.h"
26 #include "base/strings/stringprintf.h" 26 #include "base/strings/stringprintf.h"
27 #include "base/strings/utf_string_conversions.h" 27 #include "base/strings/utf_string_conversions.h"
28 #include "base/test/scoped_feature_list.h" 28 #include "base/test/scoped_feature_list.h"
29 #include "base/test/simple_test_tick_clock.h"
29 #include "base/test/test_timeouts.h" 30 #include "base/test/test_timeouts.h"
30 #include "base/values.h" 31 #include "base/values.h"
31 #include "build/build_config.h" 32 #include "build/build_config.h"
32 #include "chrome/browser/browsing_data/browsing_data_helper.h" 33 #include "chrome/browser/browsing_data/browsing_data_helper.h"
33 #include "chrome/browser/browsing_data/browsing_data_remover.h" 34 #include "chrome/browser/browsing_data/browsing_data_remover.h"
34 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" 35 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
35 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" 36 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h"
36 #include "chrome/browser/chrome_content_browser_client.h" 37 #include "chrome/browser/chrome_content_browser_client.h"
37 #include "chrome/browser/chrome_notification_types.h" 38 #include "chrome/browser/chrome_notification_types.h"
38 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 39 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
39 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 40 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
40 #include "chrome/browser/extensions/extension_apitest.h" 41 #include "chrome/browser/extensions/extension_apitest.h"
41 #include "chrome/browser/external_protocol/external_protocol_handler.h" 42 #include "chrome/browser/external_protocol/external_protocol_handler.h"
42 #include "chrome/browser/net/prediction_options.h" 43 #include "chrome/browser/net/prediction_options.h"
44 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_ test_harness.h"
45 #include "chrome/browser/page_load_metrics/observers/prerender_page_load_metrics _observer.h"
43 #include "chrome/browser/password_manager/password_store_factory.h" 46 #include "chrome/browser/password_manager/password_store_factory.h"
44 #include "chrome/browser/predictors/autocomplete_action_predictor.h" 47 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
45 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" 48 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
46 #include "chrome/browser/prerender/prerender_contents.h" 49 #include "chrome/browser/prerender/prerender_contents.h"
47 #include "chrome/browser/prerender/prerender_field_trial.h" 50 #include "chrome/browser/prerender/prerender_field_trial.h"
48 #include "chrome/browser/prerender/prerender_handle.h" 51 #include "chrome/browser/prerender/prerender_handle.h"
49 #include "chrome/browser/prerender/prerender_link_manager.h" 52 #include "chrome/browser/prerender/prerender_link_manager.h"
50 #include "chrome/browser/prerender/prerender_link_manager_factory.h" 53 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
51 #include "chrome/browser/prerender/prerender_manager.h" 54 #include "chrome/browser/prerender/prerender_manager.h"
52 #include "chrome/browser/prerender/prerender_manager_factory.h" 55 #include "chrome/browser/prerender/prerender_manager_factory.h"
56 #include "chrome/browser/prerender/prerender_tab_helper.h"
53 #include "chrome/browser/prerender/prerender_test_utils.h" 57 #include "chrome/browser/prerender/prerender_test_utils.h"
54 #include "chrome/browser/profiles/profile.h" 58 #include "chrome/browser/profiles/profile.h"
55 #include "chrome/browser/profiles/profile_io_data.h" 59 #include "chrome/browser/profiles/profile_io_data.h"
56 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h" 60 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h"
57 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h" 61 #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_m anager.h"
58 #include "chrome/browser/task_manager/task_manager_browsertest_util.h" 62 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
59 #include "chrome/browser/ui/browser.h" 63 #include "chrome/browser/ui/browser.h"
60 #include "chrome/browser/ui/browser_commands.h" 64 #include "chrome/browser/ui/browser_commands.h"
61 #include "chrome/browser/ui/browser_finder.h" 65 #include "chrome/browser/ui/browser_finder.h"
62 #include "chrome/browser/ui/browser_window.h" 66 #include "chrome/browser/ui/browser_window.h"
(...skipping 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,
pasko 2016/12/20 19:33:34 This is used only in one test, which is not a good
mattcary 2016/12/21 17:08:58 This is a text fixture only used in this file (ie,
pasko 2016/12/21 18:39:08 Yes, but the class is also about 500 lines of code
mattcary 2016/12/22 10:49:07 yes, exactly, hence the test name. It seems that
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 with and
1076 // without a prerender.
1077 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PageLoadMetrics) {
1078 // Simple load. The prefetch page is used as a simple page with a nonempty
1079 // layout; no 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 // Prerendered load.
pasko 2016/12/20 19:33:34 The Simple/Prerender tests have little in common,
mattcary 2016/12/21 17:08:58 Done.
1088 test_utils::FirstContentfulPaintManagerWaiter* prerender_fcp_waiter =
1089 test_utils::FirstContentfulPaintManagerWaiter::Create(
1090 GetPrerenderManager());
1091 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
1092 NavigateToDestURL();
1093 prerender_fcp_waiter->Wait();
1094
1095 // Histogram only emitted during the simple load.
1096 histogram_tester().ExpectTotalCount(
1097 "Prerender.none_PrefetchTTFCP.Reference.Cacheable.Visible", 1);
1098 // Histogram only emitted during prerender.
1099 histogram_tester().ExpectTotalCount(
1100 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1101 // Histogram only emitted during the two simple loads: the NavigateToURL call,
1102 // and the page containing the link rel=prerender.
1103 histogram_tester().ExpectTotalCount(
1104 "PageLoad.DocumentTiming.NavigationToFirstLayout", 2);
1105 }
1106
1024 // Checks that cross-domain prerenders emit the correct histograms. 1107 // Checks that cross-domain prerenders emit the correct histograms.
1025 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { 1108 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) {
1109 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter =
1110 test_utils::FirstContentfulPaintManagerWaiter::Create(
1111 GetPrerenderManager());
1026 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), 1112 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"),
1027 FINAL_STATUS_USED, 1); 1113 FINAL_STATUS_USED, 1);
1028 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); 1114 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1);
1029 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); 1115 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0);
1030 histogram_tester().ExpectTotalCount( 1116 histogram_tester().ExpectTotalCount(
1031 "Prerender.none_PerceivedPLTMatchedComplete", 0); 1117 "Prerender.none_PerceivedPLTMatchedComplete", 0);
1032 histogram_tester().ExpectTotalCount( 1118 histogram_tester().ExpectTotalCount(
1033 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); 1119 "Prerender.webcross_PrerenderNotSwappedInPLT", 1);
1034 1120
1035 NavigateToDestURL(); 1121 NavigateToDestURL();
1122 fcp_waiter->Wait();
1123
1036 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); 1124 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1);
1037 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched", 1125 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLTMatched",
1038 1); 1126 1);
1039 histogram_tester().ExpectTotalCount( 1127 histogram_tester().ExpectTotalCount(
1040 "Prerender.webcross_PerceivedPLTMatchedComplete", 1); 1128 "Prerender.webcross_PerceivedPLTMatchedComplete", 1);
1129 histogram_tester().ExpectTotalCount(
1130 "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
1041 } 1131 }
1042 1132
1043 // Checks that pending prerenders launch and receive proper event treatment. 1133 // Checks that pending prerenders launch and receive proper event treatment.
1044 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { 1134 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) {
1045 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( 1135 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL(
1046 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); 1136 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1);
1047 1137
1048 // Navigate to the prerender. 1138 // Navigate to the prerender.
1049 std::unique_ptr<TestPrerender> prerender2 = 1139 std::unique_ptr<TestPrerender> prerender2 =
1050 ExpectPrerender(FINAL_STATUS_USED); 1140 ExpectPrerender(FINAL_STATUS_USED);
(...skipping 2126 matching lines...) Expand 10 before | Expand all | Expand 10 after
3177 done_url, empty_file, done_counter.AsWeakPtr())); 3267 done_url, empty_file, done_counter.AsWeakPtr()));
3178 // Loading may finish or be interrupted. The final result is important only. 3268 // Loading may finish or be interrupted. The final result is important only.
3179 DisableLoadEventCheck(); 3269 DisableLoadEventCheck();
3180 // TestPrenderContents is always created before the Autosignin JS can run, so 3270 // TestPrenderContents is always created before the Autosignin JS can run, so
3181 // waiting for PrerenderContents to stop should be reliable. 3271 // waiting for PrerenderContents to stop should be reliable.
3182 PrerenderTestURL("/password/autosignin.html", 3272 PrerenderTestURL("/password/autosignin.html",
3183 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); 3273 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0);
3184 EXPECT_EQ(0, done_counter.count()); 3274 EXPECT_EQ(0, done_counter.count());
3185 } 3275 }
3186 3276
3277 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) {
3278 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3279 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3280 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3281
3282 base::TimeTicks load_start = clock->NowTicks();
3283 clock->Advance(base::TimeDelta::FromSeconds(1));
3284 NavigateToDestURL();
3285
3286 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3287 GetPrerenderManager(), GetActiveWebContents());
3288 observer.SetNavigationStartTo(load_start);
3289
3290 page_load_metrics::PageLoadTiming timing;
3291 timing.navigation_start = base::Time::FromDoubleT(1);
pasko 2016/12/21 18:39:08 this number does not contribute to any of the expe
mattcary 2016/12/22 10:49:07 Actually, it's just to initialize it to a non-null
3292 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3293 page_load_metrics::PageLoadMetricsObserverTestHarness::
3294 PopulateRequiredTimingFields(&timing);
3295 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3296
3297 histogram_tester().ExpectTotalCount(
3298 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3299 histogram_tester().ExpectUniqueSample(
3300 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3301 }
3302
3303 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) {
3304 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3305 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3306
3307 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3308 DisableJavascriptCalls();
pasko 2016/12/20 19:33:34 We are not expecting swap to succeed on this prere
mattcary 2016/12/21 17:08:58 Done, here and below. It's not the swap bit, it's
3309 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0);
3310
3311 // This prerender cancels and reuses the first.
3312 clock->Advance(base::TimeDelta::FromSeconds(1));
3313 base::TimeTicks load_start = clock->NowTicks();
3314 EnableJavascriptCalls();
3315 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3316 clock->Advance(base::TimeDelta::FromSeconds(1));
3317
3318 NavigateToDestURL();
3319 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3320 GetPrerenderManager(), GetActiveWebContents());
3321 observer.SetNavigationStartTo(load_start);
3322
3323 page_load_metrics::PageLoadTiming timing;
3324 timing.navigation_start = base::Time::FromDoubleT(1);
3325 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3326 page_load_metrics::PageLoadMetricsObserverTestHarness::
3327 PopulateRequiredTimingFields(&timing);
3328 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3329
3330 histogram_tester().ExpectTotalCount(
3331 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3332 // If the first prerender had been used, the perceived TTFCP would have been
3333 // under a second: 2362ms - 2 sec worth of Advance().
3334 histogram_tester().ExpectUniqueSample(
3335 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3336 }
3337
3338 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3339 FirstContentfulPaintTimingTimeout) {
3340 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3341 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3342
3343 // Make the first prerender time out.
3344 base::TimeDelta time_out_delta =
3345 GetPrerenderManager()->config().time_to_live +
3346 base::TimeDelta::FromSeconds(10);
3347 SetMidLoadClockAdvance(clock, time_out_delta);
3348
3349 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3350 PrerenderTestURL(url, FINAL_STATUS_TIMED_OUT, 1);
3351
3352 ClearMidLoadClock();
3353 base::TimeTicks load_start = clock->NowTicks();
3354 PrerenderTestURL(url, FINAL_STATUS_USED, 1);
3355
3356 clock->Advance(base::TimeDelta::FromSeconds(1));
3357 NavigateToDestURL();
3358
3359 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3360 GetPrerenderManager(), GetActiveWebContents());
3361 observer.SetNavigationStartTo(load_start);
3362
3363 page_load_metrics::PageLoadTiming timing;
pasko 2016/12/21 18:39:08 this part seems to repeat what the previous test d
mattcary 2016/12/22 10:49:07 Yes. The point is that parts of the page load timi
3364 timing.navigation_start = base::Time::FromDoubleT(1);
3365 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2361);
3366 page_load_metrics::PageLoadMetricsObserverTestHarness::
3367 PopulateRequiredTimingFields(&timing);
3368 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3369
3370 histogram_tester().ExpectTotalCount(
3371 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3372 // If the timed out had been used, the perceived TTFCP would have been
3373 // negative.
3374 histogram_tester().ExpectUniqueSample(
3375 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1361, 1);
3376 }
3377
3378 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3379 FirstContentfulPaintTimingNoCommit) {
3380 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3381 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3382
3383 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3384 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3385 base::FilePath(),
3386 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3387
3388 base::RunLoop prerender_start_loop;
3389 BrowserThread::PostTask(
3390 BrowserThread::IO, FROM_HERE,
3391 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3392 prerender_start_loop.QuitClosure()));
3393 DisableJavascriptCalls();
3394 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3395 prerender_start_loop.Run();
3396
3397 clock->Advance(base::TimeDelta::FromSeconds(1));
3398 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3399
3400 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3401 GetPrerenderManager(), GetActiveWebContents());
3402 observer.SetNavigationStartTo(clock->NowTicks());
3403
3404 page_load_metrics::PageLoadTiming timing;
3405 timing.navigation_start = base::Time::FromDoubleT(1);
3406 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3407 page_load_metrics::PageLoadMetricsObserverTestHarness::
3408 PopulateRequiredTimingFields(&timing);
3409 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3410
3411 histogram_tester().ExpectTotalCount(
3412 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3413 histogram_tester().ExpectTotalCount(
3414 "Prerender.none_PerceivedTTFCPRecorded.Visible", 1);
3415
3416 // Check that the prerender didn't happen with a defined origin.
3417 histogram_tester().ExpectTotalCount(
3418 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 0);
3419 histogram_tester().ExpectTotalCount(
3420 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 0);
3421
3422 // A FCP is fired by the observer, but the manager should detect that the
3423 // perceived time is not set and so update the following histogram.
pasko 2016/12/21 18:39:09 I was confused by this comment. The notion of perc
mattcary 2016/12/22 10:49:07 Done.
3424 histogram_tester().ExpectUniqueSample(
3425 "Prerender.none_PerceivedTTFCPRecorded.Visible", 0, 1);
3426 }
3427
3428 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3429 FirstContentfulPaintTimingTwoPages) {
3430 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3431 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3432
3433 DisableJavascriptCalls();
3434 // First prerender a different page from the usual target.
3435 PrerenderTestURL("/prerender/prefetch_page.html", FINAL_STATUS_CANCELLED, 0);
3436
3437 clock->Advance(base::TimeDelta::FromSeconds(1));
3438 base::TimeTicks load_start = clock->NowTicks();
3439 EnableJavascriptCalls();
3440 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3441
3442 clock->Advance(base::TimeDelta::FromSeconds(1));
3443 NavigateToDestURL();
3444
3445 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3446 GetPrerenderManager(), GetActiveWebContents());
3447 observer.SetNavigationStartTo(load_start);
3448
3449 page_load_metrics::PageLoadTiming timing;
3450 timing.navigation_start = base::Time::FromDoubleT(1);
3451 // The FCP time should end up on the edge of the bucket.
3452 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3453 page_load_metrics::PageLoadMetricsObserverTestHarness::
3454 PopulateRequiredTimingFields(&timing);
3455 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3456
3457 histogram_tester().ExpectTotalCount(
3458 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1);
3459 histogram_tester().ExpectUniqueSample(
3460 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1);
3461 }
3462
3463 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintHidden) {
3464 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3465 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3466 base::TimeTicks load_start = clock->NowTicks();
3467 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
3468
3469 clock->Advance(base::TimeDelta::FromSeconds(1));
3470 NavigateToDestURL();
3471
3472 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3473 GetPrerenderManager(), GetActiveWebContents());
3474 observer.SetNavigationStartTo(load_start);
3475
3476 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3477 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3478 GenericPageLoadExtraInfo(dest_url())));
3479
3480 page_load_metrics::PageLoadTiming timing;
3481 timing.navigation_start = base::Time::FromDoubleT(1);
3482 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2654);
3483 page_load_metrics::PageLoadMetricsObserverTestHarness::
3484 PopulateRequiredTimingFields(&timing);
3485 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3486
3487 histogram_tester().ExpectTotalCount(
3488 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1);
3489 histogram_tester().ExpectUniqueSample(
3490 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 1654, 1);
3491 }
3492
3493 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
3494 FirstContentfulPaintHiddenNoCommit) {
3495 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting();
3496 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks();
3497
3498 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html");
3499 base::FilePath url_file = ui_test_utils::GetTestFilePath(
3500 base::FilePath(),
3501 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html")));
3502
3503 base::RunLoop prerender_start_loop;
3504 BrowserThread::PostTask(
3505 BrowserThread::IO, FROM_HERE,
3506 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file,
3507 prerender_start_loop.QuitClosure()));
3508 DisableJavascriptCalls();
3509 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0);
3510 prerender_start_loop.Run();
3511
3512 clock->Advance(base::TimeDelta::FromSeconds(1));
3513 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
3514
3515 test_utils::TestPrerenderPageLoadMetricsObserver observer(
3516 GetPrerenderManager(), GetActiveWebContents());
3517 observer.SetNavigationStartTo(clock->NowTicks());
3518
3519 EXPECT_EQ(page_load_metrics::PageLoadMetricsObserver::CONTINUE_OBSERVING,
3520 observer.OnHidden(page_load_metrics::PageLoadTiming(),
3521 GenericPageLoadExtraInfo(dest_url())));
3522
3523 page_load_metrics::PageLoadTiming timing;
3524 timing.navigation_start = base::Time::FromDoubleT(1);
3525 timing.first_contentful_paint = base::TimeDelta::FromMilliseconds(2362);
3526 page_load_metrics::PageLoadMetricsObserverTestHarness::
3527 PopulateRequiredTimingFields(&timing);
3528 observer.OnFirstContentfulPaint(timing, GenericPageLoadExtraInfo(dest_url()));
3529
3530 histogram_tester().ExpectTotalCount(
3531 "Prerender.none_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3532 histogram_tester().ExpectTotalCount(
3533 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 1);
3534
3535 // Check that the prerender didn't happen with a defined origin.
3536 histogram_tester().ExpectTotalCount(
3537 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Hidden", 0);
3538 histogram_tester().ExpectTotalCount(
3539 "Prerender.websame_PerceivedTTFCPRecorded.Hidden", 0);
3540
3541 // A FCP is fired by the observer, but the manager should detect that the
3542 // perceived time is not set and so update the following histogram.
3543 histogram_tester().ExpectUniqueSample(
3544 "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1);
3545 }
3546
3187 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { 3547 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
3188 public: 3548 public:
3189 void SetUpOnMainThread() override { 3549 void SetUpOnMainThread() override {
3190 Profile* normal_profile = current_browser()->profile(); 3550 Profile* normal_profile = current_browser()->profile();
3191 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank"))); 3551 set_browser(OpenURLOffTheRecord(normal_profile, GURL("about:blank")));
3192 PrerenderBrowserTest::SetUpOnMainThread(); 3552 PrerenderBrowserTest::SetUpOnMainThread();
3193 } 3553 }
3194 }; 3554 };
3195 3555
3196 // Checks that prerendering works in incognito mode. 3556 // 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(); 3691 browser()->tab_strip_model()->GetActiveWebContents();
3332 bool display_test_result = false; 3692 bool display_test_result = false;
3333 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, 3693 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents,
3334 "DidDisplayReallyPass()", 3694 "DidDisplayReallyPass()",
3335 &display_test_result)); 3695 &display_test_result));
3336 ASSERT_TRUE(display_test_result); 3696 ASSERT_TRUE(display_test_result);
3337 } 3697 }
3338 #endif // !defined(DISABLE_NACL) 3698 #endif // !defined(DISABLE_NACL)
3339 3699
3340 } // namespace prerender 3700 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698