| 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 |