OLD | NEW |
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> |
(...skipping 1016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 | 1027 |
1028 // Checks that a page is correctly prerendered in the case of a | 1028 // Checks that a page is correctly prerendered in the case of a |
1029 // <link rel=prerender> tag and then loaded into a tab in response to a | 1029 // <link rel=prerender> tag and then loaded into a tab in response to a |
1030 // navigation. | 1030 // navigation. |
1031 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { | 1031 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
1032 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = | 1032 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = |
1033 test_utils::FirstContentfulPaintManagerWaiter::Create( | 1033 test_utils::FirstContentfulPaintManagerWaiter::Create( |
1034 GetPrerenderManager()); | 1034 GetPrerenderManager()); |
1035 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 1035 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
1036 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); | 1036 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); |
1037 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
1038 histogram_tester().ExpectTotalCount( | |
1039 "Prerender.websame_PrerenderNotSwappedInPLT", 1); | |
1040 | 1037 |
1041 ChannelDestructionWatcher channel_close_watcher; | 1038 ChannelDestructionWatcher channel_close_watcher; |
1042 channel_close_watcher.WatchChannel( | 1039 channel_close_watcher.WatchChannel( |
1043 GetActiveWebContents()->GetRenderProcessHost()); | 1040 GetActiveWebContents()->GetRenderProcessHost()); |
1044 NavigateToDestURL(); | 1041 NavigateToDestURL(); |
1045 channel_close_watcher.WaitForChannelClose(); | 1042 channel_close_watcher.WaitForChannelClose(); |
1046 fcp_waiter->Wait(); | 1043 fcp_waiter->Wait(); |
1047 | 1044 |
1048 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); | |
1049 histogram_tester().ExpectTotalCount( | 1045 histogram_tester().ExpectTotalCount( |
1050 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); | 1046 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
1051 histogram_tester().ExpectTotalCount( | 1047 histogram_tester().ExpectTotalCount( |
1052 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 1); | 1048 "Prerender.websame_PerceivedTTFCPRecorded.Visible", 1); |
1053 | 1049 |
1054 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); | 1050 ASSERT_TRUE(IsEmptyPrerenderLinkManager()); |
1055 } | 1051 } |
1056 | 1052 |
1057 // Checks that the correct page load metrics observers are produced without a | 1053 // Checks that the correct page load metrics observers are produced without a |
1058 // prerender. | 1054 // prerender. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 0); | 1100 "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 0); |
1105 } | 1101 } |
1106 | 1102 |
1107 // Checks that cross-domain prerenders emit the correct histograms. | 1103 // Checks that cross-domain prerenders emit the correct histograms. |
1108 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { | 1104 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageCrossDomain) { |
1109 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = | 1105 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = |
1110 test_utils::FirstContentfulPaintManagerWaiter::Create( | 1106 test_utils::FirstContentfulPaintManagerWaiter::Create( |
1111 GetPrerenderManager()); | 1107 GetPrerenderManager()); |
1112 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), | 1108 PrerenderTestURL(GetCrossDomainTestUrl("prerender/prerender_page.html"), |
1113 FINAL_STATUS_USED, 1); | 1109 FINAL_STATUS_USED, 1); |
1114 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
1115 histogram_tester().ExpectTotalCount( | |
1116 "Prerender.webcross_PrerenderNotSwappedInPLT", 1); | |
1117 | 1110 |
1118 NavigateToDestURL(); | 1111 NavigateToDestURL(); |
1119 fcp_waiter->Wait(); | 1112 fcp_waiter->Wait(); |
1120 | 1113 |
1121 histogram_tester().ExpectTotalCount("Prerender.webcross_PerceivedPLT", 1); | |
1122 histogram_tester().ExpectTotalCount( | 1114 histogram_tester().ExpectTotalCount( |
1123 "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1); | 1115 "Prerender.webcross_PrefetchTTFCP.Warm.Cacheable.Visible", 1); |
1124 } | 1116 } |
1125 | 1117 |
1126 // Checks that pending prerenders launch and receive proper event treatment. | 1118 // Checks that pending prerenders launch and receive proper event treatment. |
1127 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { | 1119 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPagePending) { |
1128 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( | 1120 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( |
1129 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); | 1121 "/prerender/prerender_page_pending.html", FINAL_STATUS_USED, 1); |
1130 | 1122 |
1131 // Navigate to the prerender. | 1123 // Navigate to the prerender. |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 | 1479 |
1488 // Checks that redirects with location.replace do not cancel a prerender and | 1480 // Checks that redirects with location.replace do not cancel a prerender and |
1489 // and swap when navigating to the second. | 1481 // and swap when navigating to the second. |
1490 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1482 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1491 PrerenderLocationReplaceNavigateToSecond) { | 1483 PrerenderLocationReplaceNavigateToSecond) { |
1492 PrerenderTestURL("/prerender/prerender_location_replace.html", | 1484 PrerenderTestURL("/prerender/prerender_location_replace.html", |
1493 FINAL_STATUS_USED, 2); | 1485 FINAL_STATUS_USED, 2); |
1494 NavigateToURL("/prerender/prerender_page.html"); | 1486 NavigateToURL("/prerender/prerender_page.html"); |
1495 } | 1487 } |
1496 | 1488 |
1497 // Checks that we get the right PPLT histograms for client redirect prerenders | 1489 // Checks that the PrefetchTTFCP histogram is recorded across the client |
1498 // and navigations when the referring page is Google. | 1490 // redirect when the referring page is Google. |
1499 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1491 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1500 PrerenderLocationReplaceGWSHistograms) { | 1492 PrerenderLocationReplaceGWSHistograms) { |
1501 DisableJavascriptCalls(); | 1493 DisableJavascriptCalls(); |
1502 | 1494 |
1503 // The loader page should look like Google. | 1495 // The loader page should look like Google. |
1504 static const char kGoogleDotCom[] = "www.google.com"; | 1496 static const char kGoogleDotCom[] = "www.google.com"; |
1505 SetLoaderHostOverride(kGoogleDotCom); | 1497 SetLoaderHostOverride(kGoogleDotCom); |
1506 set_loader_path("/prerender/prerender_loader_with_replace_state.html"); | 1498 set_loader_path("/prerender/prerender_loader_with_replace_state.html"); |
1507 | 1499 |
1508 GURL dest_url = | 1500 GURL dest_url = |
1509 GetCrossDomainTestUrl("prerender/prerender_deferred_image.html"); | 1501 GetCrossDomainTestUrl("prerender/prerender_deferred_image.html"); |
1510 | 1502 |
1511 GURL prerender_url = embedded_test_server()->GetURL( | 1503 GURL prerender_url = embedded_test_server()->GetURL( |
1512 "/prerender/prerender_location_replace.html?" + | 1504 "/prerender/prerender_location_replace.html?" + |
1513 net::EscapeQueryParamValue(dest_url.spec(), false) + "#prerender"); | 1505 net::EscapeQueryParamValue(dest_url.spec(), false) + "#prerender"); |
1514 GURL::Replacements replacements; | 1506 GURL::Replacements replacements; |
1515 replacements.SetHostStr(kGoogleDotCom); | 1507 replacements.SetHostStr(kGoogleDotCom); |
1516 prerender_url = prerender_url.ReplaceComponents(replacements); | 1508 prerender_url = prerender_url.ReplaceComponents(replacements); |
1517 | 1509 |
1518 // The prerender will not completely load until after the swap, so wait for a | 1510 // The prerender will not completely load until after the swap, so wait for a |
1519 // title change before calling DidPrerenderPass. | 1511 // title change before calling DidPrerenderPass. |
1520 std::unique_ptr<TestPrerender> prerender = | 1512 std::unique_ptr<TestPrerender> prerender = |
1521 PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); | 1513 PrerenderTestURL(prerender_url, FINAL_STATUS_USED, 1); |
1522 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); | 1514 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); |
1523 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); | 1515 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); |
1524 EXPECT_EQ(1, prerender->number_of_loads()); | 1516 EXPECT_EQ(1, prerender->number_of_loads()); |
1525 | 1517 |
1526 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
1527 // Although there is a client redirect, it is dropped from histograms because | |
1528 // it is a Google URL. The target page itself does not load until after the | |
1529 // swap. | |
1530 histogram_tester().ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", | |
1531 0); | |
1532 | |
1533 GURL navigate_url = embedded_test_server()->GetURL( | 1518 GURL navigate_url = embedded_test_server()->GetURL( |
1534 "/prerender/prerender_location_replace.html?" + | 1519 "/prerender/prerender_location_replace.html?" + |
1535 net::EscapeQueryParamValue(dest_url.spec(), false) + "#navigate"); | 1520 net::EscapeQueryParamValue(dest_url.spec(), false) + "#navigate"); |
1536 navigate_url = navigate_url.ReplaceComponents(replacements); | 1521 navigate_url = navigate_url.ReplaceComponents(replacements); |
1537 | 1522 |
1538 NavigationOrSwapObserver swap_observer( | 1523 // Open the URL and wait for the FCP. |
1539 current_browser()->tab_strip_model(), | 1524 test_utils::FirstContentfulPaintManagerWaiter* fcp_waiter = |
1540 GetActiveWebContents(), 2); | 1525 test_utils::FirstContentfulPaintManagerWaiter::Create( |
| 1526 GetPrerenderManager()); |
1541 current_browser()->OpenURL(OpenURLParams(navigate_url, Referrer(), | 1527 current_browser()->OpenURL(OpenURLParams(navigate_url, Referrer(), |
1542 WindowOpenDisposition::CURRENT_TAB, | 1528 WindowOpenDisposition::CURRENT_TAB, |
1543 ui::PAGE_TRANSITION_TYPED, false)); | 1529 ui::PAGE_TRANSITION_TYPED, false)); |
1544 swap_observer.Wait(); | 1530 fcp_waiter->Wait(); |
1545 | 1531 |
1546 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); | 1532 // The client redirect changes the PageLoadExtraInfo.start_url and hence the |
1547 | 1533 // past navigation cannot be found for the histogram to be recorded as |
1548 histogram_tester().ExpectTotalCount("Prerender.gws_PrerenderNotSwappedInPLT", | 1534 // PrefetchTTFCP.Warm. |
1549 0); | 1535 histogram_tester().ExpectTotalCount( |
1550 histogram_tester().ExpectTotalCount("Prerender.gws_PerceivedPLT", 1); | 1536 "Prerender.gws_PrefetchTTFCP.Reference.Cacheable.Visible", 1); |
1551 | |
1552 // The client redirect does /not/ count as a miss because it's a Google URL. | |
1553 histogram_tester().ExpectTotalCount("Prerender.PerceivedPLTFirstAfterMiss", | |
1554 0); | |
1555 } | 1537 } |
1556 | 1538 |
1557 // Checks that client-issued redirects work with prerendering. | 1539 // Checks that client-issued redirects work with prerendering. |
1558 // This version navigates to the final destination page, rather than the | 1540 // This version navigates to the final destination page, rather than the |
1559 // page which does the redirection via a mouse click. | 1541 // page which does the redirection via a mouse click. |
1560 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1542 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1561 PrerenderClientRedirectNavigateToSecondViaClick) { | 1543 PrerenderClientRedirectNavigateToSecondViaClick) { |
1562 GURL prerender_url = embedded_test_server()->GetURL( | 1544 GURL prerender_url = embedded_test_server()->GetURL( |
1563 CreateClientRedirect("/prerender/prerender_page.html")); | 1545 CreateClientRedirect("/prerender/prerender_page.html")); |
1564 GURL destination_url = | 1546 GURL destination_url = |
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3013 DisableJavascriptCalls(); | 2995 DisableJavascriptCalls(); |
3014 | 2996 |
3015 // The prerender will not completely load until after the swap, so wait for a | 2997 // The prerender will not completely load until after the swap, so wait for a |
3016 // title change before calling DidPrerenderPass. | 2998 // title change before calling DidPrerenderPass. |
3017 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( | 2999 std::unique_ptr<TestPrerender> prerender = PrerenderTestURL( |
3018 "/prerender/prerender_deferred_image.html", FINAL_STATUS_USED, 0); | 3000 "/prerender/prerender_deferred_image.html", FINAL_STATUS_USED, 0); |
3019 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); | 3001 WaitForASCIITitle(prerender->contents()->prerender_contents(), kReadyTitle); |
3020 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); | 3002 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); |
3021 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); | 3003 EXPECT_TRUE(DidPrerenderPass(prerender->contents()->prerender_contents())); |
3022 EXPECT_EQ(0, prerender->number_of_loads()); | 3004 EXPECT_EQ(0, prerender->number_of_loads()); |
3023 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
3024 histogram_tester().ExpectTotalCount( | |
3025 "Prerender.websame_PrerenderNotSwappedInPLT", 0); | |
3026 | 3005 |
3027 // Swap. | 3006 // Swap. |
3028 NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), | 3007 NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(), |
3029 GetActiveWebContents()); | 3008 GetActiveWebContents()); |
3030 ui_test_utils::NavigateToURLWithDisposition( | 3009 ui_test_utils::NavigateToURLWithDisposition( |
3031 current_browser(), dest_url(), WindowOpenDisposition::CURRENT_TAB, | 3010 current_browser(), dest_url(), WindowOpenDisposition::CURRENT_TAB, |
3032 ui_test_utils::BROWSER_TEST_NONE); | 3011 ui_test_utils::BROWSER_TEST_NONE); |
3033 swap_observer.Wait(); | 3012 swap_observer.Wait(); |
3034 | 3013 |
3035 // The prerender never observes the final load. | 3014 // The prerender never observes the final load. |
3036 EXPECT_EQ(0, prerender->number_of_loads()); | 3015 EXPECT_EQ(0, prerender->number_of_loads()); |
3037 | 3016 |
3038 // Now check DidDisplayPass. | 3017 // Now check DidDisplayPass. |
3039 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); | 3018 EXPECT_TRUE(DidDisplayPass(GetActiveWebContents())); |
3040 | |
3041 histogram_tester().ExpectTotalCount( | |
3042 "Prerender.websame_PrerenderNotSwappedInPLT", 0); | |
3043 histogram_tester().ExpectTotalCount("Prerender.websame_PerceivedPLT", 1); | |
3044 } | 3019 } |
3045 | 3020 |
3046 // Checks that a deferred redirect to an image is not loaded until the | 3021 // Checks that a deferred redirect to an image is not loaded until the |
3047 // page is visible, even after another redirect. | 3022 // page is visible, even after another redirect. |
3048 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 3023 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
3049 PrerenderDeferredImageAfterRedirect) { | 3024 PrerenderDeferredImageAfterRedirect) { |
3050 DisableJavascriptCalls(); | 3025 DisableJavascriptCalls(); |
3051 | 3026 |
3052 // The prerender will not completely load until after the swap, so wait for a | 3027 // The prerender will not completely load until after the swap, so wait for a |
3053 // title change before calling DidPrerenderPass. | 3028 // title change before calling DidPrerenderPass. |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3203 BrowserThread::IO, FROM_HERE, | 3178 BrowserThread::IO, FROM_HERE, |
3204 base::Bind(&CreateCountingInterceptorOnIO, | 3179 base::Bind(&CreateCountingInterceptorOnIO, |
3205 kPingURL, empty_file, ping_counter.AsWeakPtr())); | 3180 kPingURL, empty_file, ping_counter.AsWeakPtr())); |
3206 | 3181 |
3207 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 3182 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
3208 OpenDestURLViaClickPing(kPingURL); | 3183 OpenDestURLViaClickPing(kPingURL); |
3209 | 3184 |
3210 ping_counter.WaitForCount(1); | 3185 ping_counter.WaitForCount(1); |
3211 } | 3186 } |
3212 | 3187 |
3213 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPPLTNormalNavigation) { | |
3214 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | |
3215 ui_test_utils::NavigateToURL(current_browser(), url); | |
3216 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | |
3217 } | |
3218 | |
3219 // Checks that a prerender which calls window.close() on itself is aborted. | 3188 // Checks that a prerender which calls window.close() on itself is aborted. |
3220 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { | 3189 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWindowClose) { |
3221 DisableLoadEventCheck(); | 3190 DisableLoadEventCheck(); |
3222 PrerenderTestURL("/prerender/prerender_window_close.html", | 3191 PrerenderTestURL("/prerender/prerender_window_close.html", |
3223 FINAL_STATUS_CLOSED, 0); | 3192 FINAL_STATUS_CLOSED, 0); |
3224 } | 3193 } |
3225 | 3194 |
3226 // Tests interaction between prerender and POST (i.e. POST request should still | 3195 // Tests interaction between prerender and POST (i.e. POST request should still |
3227 // be made and POST data should not be dropped when the POST target is the same | 3196 // be made and POST data should not be dropped when the POST target is the same |
3228 // as a prerender link). | 3197 // as a prerender link). |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3804 browser()->tab_strip_model()->GetActiveWebContents(); | 3773 browser()->tab_strip_model()->GetActiveWebContents(); |
3805 bool display_test_result = false; | 3774 bool display_test_result = false; |
3806 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, | 3775 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, |
3807 "DidDisplayReallyPass()", | 3776 "DidDisplayReallyPass()", |
3808 &display_test_result)); | 3777 &display_test_result)); |
3809 ASSERT_TRUE(display_test_result); | 3778 ASSERT_TRUE(display_test_result); |
3810 } | 3779 } |
3811 #endif // !defined(DISABLE_NACL) | 3780 #endif // !defined(DISABLE_NACL) |
3812 | 3781 |
3813 } // namespace prerender | 3782 } // namespace prerender |
OLD | NEW |