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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 using content::Referrer; | 136 using content::Referrer; |
137 using content::RenderFrameHost; | 137 using content::RenderFrameHost; |
138 using content::RenderViewHost; | 138 using content::RenderViewHost; |
139 using content::RenderWidgetHost; | 139 using content::RenderWidgetHost; |
140 using content::TestNavigationObserver; | 140 using content::TestNavigationObserver; |
141 using content::WebContents; | 141 using content::WebContents; |
142 using content::WebContentsObserver; | 142 using content::WebContentsObserver; |
143 using net::NetworkChangeNotifier; | 143 using net::NetworkChangeNotifier; |
144 using prerender::test_utils::RequestCounter; | 144 using prerender::test_utils::RequestCounter; |
145 using prerender::test_utils::CreateCountingInterceptorOnIO; | 145 using prerender::test_utils::CreateCountingInterceptorOnIO; |
146 using prerender::test_utils::CreateHangingFirstRequestInterceptor; | 146 using prerender::test_utils::CreateHangingFirstRequestInterceptorOnIO; |
147 using prerender::test_utils::CreateMockInterceptorOnIO; | 147 using prerender::test_utils::CreateMockInterceptorOnIO; |
148 using prerender::test_utils::TestPrerender; | 148 using prerender::test_utils::TestPrerender; |
149 using prerender::test_utils::TestPrerenderContents; | 149 using prerender::test_utils::TestPrerenderContents; |
150 using task_manager::browsertest_util::WaitForTaskManagerRows; | 150 using task_manager::browsertest_util::WaitForTaskManagerRows; |
151 | 151 |
152 // crbug.com/708158 | 152 // crbug.com/708158 |
153 #if !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) | 153 #if !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) |
154 | 154 |
155 // Prerender tests work as follows: | 155 // Prerender tests work as follows: |
156 // | 156 // |
157 // A page with a prefetch link to the test page is loaded. Once prerendered, | 157 // A page with a prefetch link to the test page is loaded. Once prerendered, |
158 // its Javascript function DidPrerenderPass() is called, which returns true if | 158 // its Javascript function DidPrerenderPass() is called, which returns true if |
159 // the page behaves as expected when prerendered. | 159 // the page behaves as expected when prerendered. |
160 // | 160 // |
161 // The prerendered page is then displayed on a tab. The Javascript function | 161 // The prerendered page is then displayed on a tab. The Javascript function |
162 // DidDisplayPass() is called, and returns true if the page behaved as it | 162 // DidDisplayPass() is called, and returns true if the page behaved as it |
163 // should while being displayed. | 163 // should while being displayed. |
164 | 164 |
165 namespace prerender { | 165 namespace prerender { |
166 | 166 |
167 namespace { | 167 namespace { |
168 | 168 |
169 const char kPrefetchJpeg[] = "/prerender/image.jpeg"; | |
170 | |
171 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { | 169 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { |
172 public: | 170 public: |
173 explicit FaviconUpdateWatcher(content::WebContents* web_contents) | 171 explicit FaviconUpdateWatcher(content::WebContents* web_contents) |
174 : seen_(false), running_(false), scoped_observer_(this) { | 172 : seen_(false), running_(false), scoped_observer_(this) { |
175 scoped_observer_.Add( | 173 scoped_observer_.Add( |
176 favicon::ContentFaviconDriver::FromWebContents(web_contents)); | 174 favicon::ContentFaviconDriver::FromWebContents(web_contents)); |
177 } | 175 } |
178 | 176 |
179 void Wait() { | 177 void Wait() { |
180 if (seen_) | 178 if (seen_) |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 base::FilePath(FILE_PATH_LITERAL("prerender")), | 532 base::FilePath(FILE_PATH_LITERAL("prerender")), |
535 base::FilePath().AppendASCII(file_name)); | 533 base::FilePath().AppendASCII(file_name)); |
536 } | 534 } |
537 | 535 |
538 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( | 536 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( |
539 const GURL& dest_url) { | 537 const GURL& dest_url) { |
540 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( | 538 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( |
541 dest_url, false /* started_in_foreground */); | 539 dest_url, false /* started_in_foreground */); |
542 } | 540 } |
543 | 541 |
544 // Helper function, to allow passing a UI closure to | |
545 // CreateHangingFirstRequestInterceptor() instead of a IO callback. | |
546 base::Callback<void(net::URLRequest*)> GetIOCallbackFromUIClosure( | |
547 base::Closure ui_closure) { | |
548 auto lambda = [](base::Closure closure, net::URLRequest*) { | |
549 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, | |
550 closure); | |
551 }; | |
552 return base::Bind(lambda, ui_closure); | |
553 } | |
554 | |
555 } // namespace | 542 } // namespace |
556 | 543 |
557 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { | 544 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
558 public: | 545 public: |
559 PrerenderBrowserTest() | 546 PrerenderBrowserTest() |
560 : call_javascript_(true), | 547 : call_javascript_(true), |
561 check_load_events_(true), | 548 check_load_events_(true), |
562 loader_path_("/prerender/prerender_loader.html") {} | 549 loader_path_("/prerender/prerender_loader.html") {} |
563 | 550 |
564 ~PrerenderBrowserTest() override {} | 551 ~PrerenderBrowserTest() override {} |
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap | 1295 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap |
1309 #endif | 1296 #endif |
1310 // Checks that the prerendering of a page is canceled correctly if we try to | 1297 // Checks that the prerendering of a page is canceled correctly if we try to |
1311 // swap it in before it commits. | 1298 // swap it in before it commits. |
1312 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { | 1299 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { |
1313 // Navigate to a page that triggers a prerender for a URL that never commits. | 1300 // Navigate to a page that triggers a prerender for a URL that never commits. |
1314 const GURL kNoCommitUrl("http://never-respond.example.com"); | 1301 const GURL kNoCommitUrl("http://never-respond.example.com"); |
1315 base::FilePath file(GetTestPath("prerender_page.html")); | 1302 base::FilePath file(GetTestPath("prerender_page.html")); |
1316 | 1303 |
1317 base::RunLoop prerender_start_loop; | 1304 base::RunLoop prerender_start_loop; |
1318 CreateHangingFirstRequestInterceptor( | 1305 BrowserThread::PostTask( |
1319 kNoCommitUrl, file, | 1306 BrowserThread::IO, FROM_HERE, |
1320 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); | 1307 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, |
| 1308 prerender_start_loop.QuitClosure())); |
1321 DisableJavascriptCalls(); | 1309 DisableJavascriptCalls(); |
1322 PrerenderTestURL(kNoCommitUrl, | 1310 PrerenderTestURL(kNoCommitUrl, |
1323 FINAL_STATUS_NAVIGATION_UNCOMMITTED, | 1311 FINAL_STATUS_NAVIGATION_UNCOMMITTED, |
1324 0); | 1312 0); |
1325 // Wait for the hanging request to be scheduled. | 1313 // Wait for the hanging request to be scheduled. |
1326 prerender_start_loop.Run(); | 1314 prerender_start_loop.Run(); |
1327 | 1315 |
1328 // Navigate to the URL, but assume the contents won't be swapped in. | 1316 // Navigate to the URL, but assume the contents won't be swapped in. |
1329 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 1317 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
1330 } | 1318 } |
1331 | 1319 |
1332 // crbug.com/708158 | 1320 // crbug.com/708158 |
1333 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) | 1321 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) |
1334 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 | 1322 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 |
1335 #else | 1323 #else |
1336 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 | 1324 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 |
1337 #endif | 1325 #endif |
1338 // Checks that client redirects don't add alias URLs until after they commit. | 1326 // Checks that client redirects don't add alias URLs until after they commit. |
1339 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { | 1327 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { |
1340 // Navigate to a page that then navigates to a URL that never commits. | 1328 // Navigate to a page that then navigates to a URL that never commits. |
1341 const GURL kNoCommitUrl("http://never-respond.example.com"); | 1329 const GURL kNoCommitUrl("http://never-respond.example.com"); |
1342 base::FilePath file(GetTestPath("prerender_page.html")); | 1330 base::FilePath file(GetTestPath("prerender_page.html")); |
1343 | 1331 |
1344 base::RunLoop prerender_start_loop; | 1332 base::RunLoop prerender_start_loop; |
1345 CreateHangingFirstRequestInterceptor( | 1333 BrowserThread::PostTask( |
1346 kNoCommitUrl, file, | 1334 BrowserThread::IO, FROM_HERE, |
1347 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); | 1335 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, |
| 1336 prerender_start_loop.QuitClosure())); |
1348 DisableJavascriptCalls(); | 1337 DisableJavascriptCalls(); |
1349 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), | 1338 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), |
1350 FINAL_STATUS_APP_TERMINATING, 1); | 1339 FINAL_STATUS_APP_TERMINATING, 1); |
1351 // Wait for the hanging request to be scheduled. | 1340 // Wait for the hanging request to be scheduled. |
1352 prerender_start_loop.Run(); | 1341 prerender_start_loop.Run(); |
1353 | 1342 |
1354 // Navigating to the second URL should not swap. | 1343 // Navigating to the second URL should not swap. |
1355 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, | 1344 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, |
1356 false); | 1345 false); |
1357 } | 1346 } |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2113 // Checks that prerendering a PNG works correctly. | 2102 // Checks that prerendering a PNG works correctly. |
2114 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { | 2103 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { |
2115 DisableJavascriptCalls(); | 2104 DisableJavascriptCalls(); |
2116 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); | 2105 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); |
2117 NavigateToDestURL(); | 2106 NavigateToDestURL(); |
2118 } | 2107 } |
2119 | 2108 |
2120 // Checks that prerendering a JPG works correctly. | 2109 // Checks that prerendering a JPG works correctly. |
2121 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { | 2110 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { |
2122 DisableJavascriptCalls(); | 2111 DisableJavascriptCalls(); |
2123 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_USED, 1); | 2112 PrerenderTestURL("/prerender/image.jpeg", FINAL_STATUS_USED, 1); |
2124 NavigateToDestURL(); | 2113 NavigateToDestURL(); |
2125 } | 2114 } |
2126 | 2115 |
2127 // Checks that a prerender of a CRX will result in a cancellation due to | 2116 // Checks that a prerender of a CRX will result in a cancellation due to |
2128 // download. | 2117 // download. |
2129 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { | 2118 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { |
2130 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); | 2119 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); |
2131 } | 2120 } |
2132 | 2121 |
2133 // Checks that xhr GET requests allow prerenders. | 2122 // Checks that xhr GET requests allow prerenders. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2185 } | 2174 } |
2186 | 2175 |
2187 // Checks that an SSL error that comes from a subresource does not cancel | 2176 // Checks that an SSL error that comes from a subresource does not cancel |
2188 // the page. Non-main-frame requests are simply cancelled if they run into | 2177 // the page. Non-main-frame requests are simply cancelled if they run into |
2189 // an SSL problem. | 2178 // an SSL problem. |
2190 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { | 2179 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { |
2191 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 2180 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
2192 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); | 2181 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
2193 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 2182 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
2194 ASSERT_TRUE(https_server.Start()); | 2183 ASSERT_TRUE(https_server.Start()); |
2195 GURL https_url = https_server.GetURL(kPrefetchJpeg); | 2184 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); |
2196 base::StringPairs replacement_text; | 2185 base::StringPairs replacement_text; |
2197 replacement_text.push_back( | 2186 replacement_text.push_back( |
2198 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); | 2187 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
2199 std::string replacement_path; | 2188 std::string replacement_path; |
2200 net::test_server::GetFilePathWithReplacements( | 2189 net::test_server::GetFilePathWithReplacements( |
2201 "/prerender/prerender_with_image.html", replacement_text, | 2190 "/prerender/prerender_with_image.html", replacement_text, |
2202 &replacement_path); | 2191 &replacement_path); |
2203 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); | 2192 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
2204 NavigateToDestURL(); | 2193 NavigateToDestURL(); |
2205 } | 2194 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2297 ->set_client_cert_store_factory_for_testing(base::Bind( | 2286 ->set_client_cert_store_factory_for_testing(base::Bind( |
2298 &CreateCertStore, net::ImportCertFromFile( | 2287 &CreateCertStore, net::ImportCertFromFile( |
2299 net::GetTestCertsDirectory(), "ok_cert.pem"))); | 2288 net::GetTestCertsDirectory(), "ok_cert.pem"))); |
2300 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 2289 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
2301 net::SSLServerConfig ssl_config; | 2290 net::SSLServerConfig ssl_config; |
2302 ssl_config.client_cert_type = | 2291 ssl_config.client_cert_type = |
2303 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; | 2292 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; |
2304 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); | 2293 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); |
2305 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 2294 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
2306 ASSERT_TRUE(https_server.Start()); | 2295 ASSERT_TRUE(https_server.Start()); |
2307 GURL https_url = https_server.GetURL(kPrefetchJpeg); | 2296 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); |
2308 base::StringPairs replacement_text; | 2297 base::StringPairs replacement_text; |
2309 replacement_text.push_back( | 2298 replacement_text.push_back( |
2310 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); | 2299 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
2311 std::string replacement_path; | 2300 std::string replacement_path; |
2312 net::test_server::GetFilePathWithReplacements( | 2301 net::test_server::GetFilePathWithReplacements( |
2313 "/prerender/prerender_with_image.html", replacement_text, | 2302 "/prerender/prerender_with_image.html", replacement_text, |
2314 &replacement_path); | 2303 &replacement_path); |
2315 PrerenderTestURL(replacement_path, | 2304 PrerenderTestURL(replacement_path, |
2316 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, | 2305 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, |
2317 0); | 2306 0); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2371 PrerenderSafeBrowsingClientRedirect) { | 2360 PrerenderSafeBrowsingClientRedirect) { |
2372 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 2361 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
2373 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( | 2362 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
2374 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 2363 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
2375 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), | 2364 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), |
2376 FINAL_STATUS_SAFE_BROWSING, 1); | 2365 FINAL_STATUS_SAFE_BROWSING, 1); |
2377 } | 2366 } |
2378 | 2367 |
2379 // Ensures that we do not prerender pages which have a malware subresource. | 2368 // Ensures that we do not prerender pages which have a malware subresource. |
2380 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { | 2369 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { |
2381 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg); | 2370 GURL image_url = embedded_test_server()->GetURL("/prerender/image.jpeg"); |
2382 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( | 2371 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
2383 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 2372 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
2384 base::StringPairs replacement_text; | 2373 base::StringPairs replacement_text; |
2385 replacement_text.push_back( | 2374 replacement_text.push_back( |
2386 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); | 2375 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); |
2387 std::string replacement_path; | 2376 std::string replacement_path; |
2388 net::test_server::GetFilePathWithReplacements( | 2377 net::test_server::GetFilePathWithReplacements( |
2389 "/prerender/prerender_with_image.html", replacement_text, | 2378 "/prerender/prerender_with_image.html", replacement_text, |
2390 &replacement_path); | 2379 &replacement_path); |
2391 PrerenderTestURL(replacement_path, | 2380 PrerenderTestURL(replacement_path, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2495 destruction_observer.Wait(); | 2484 destruction_observer.Wait(); |
2496 } | 2485 } |
2497 | 2486 |
2498 // Checks that a hanging unload on the referring page of a prerender swap does | 2487 // Checks that a hanging unload on the referring page of a prerender swap does |
2499 // not crash the browser on exit. | 2488 // not crash the browser on exit. |
2500 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { | 2489 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { |
2501 // Matches URL in prerender_loader_with_unload.html. | 2490 // Matches URL in prerender_loader_with_unload.html. |
2502 const GURL hang_url("http://unload-url.test"); | 2491 const GURL hang_url("http://unload-url.test"); |
2503 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 2492 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
2504 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 2493 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
2505 CreateHangingFirstRequestInterceptor( | 2494 BrowserThread::PostTask( |
2506 hang_url, empty_file, base::Callback<void(net::URLRequest*)>()); | 2495 BrowserThread::IO, FROM_HERE, |
| 2496 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, |
| 2497 hang_url, empty_file, |
| 2498 base::Closure())); |
2507 | 2499 |
2508 set_loader_path("/prerender/prerender_loader_with_unload.html"); | 2500 set_loader_path("/prerender/prerender_loader_with_unload.html"); |
2509 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 2501 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
2510 NavigateToDestURL(); | 2502 NavigateToDestURL(); |
2511 } | 2503 } |
2512 | 2504 |
2513 | 2505 |
2514 // Checks that when the history is cleared, prerendering is cancelled and | 2506 // Checks that when the history is cleared, prerendering is cancelled and |
2515 // prerendering history is cleared. | 2507 // prerendering history is cleared. |
2516 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { | 2508 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3292 done_url, empty_file, done_counter.AsWeakPtr())); | 3284 done_url, empty_file, done_counter.AsWeakPtr())); |
3293 // Loading may finish or be interrupted. The final result is important only. | 3285 // Loading may finish or be interrupted. The final result is important only. |
3294 DisableLoadEventCheck(); | 3286 DisableLoadEventCheck(); |
3295 // TestPrenderContents is always created before the Autosignin JS can run, so | 3287 // TestPrenderContents is always created before the Autosignin JS can run, so |
3296 // waiting for PrerenderContents to stop should be reliable. | 3288 // waiting for PrerenderContents to stop should be reliable. |
3297 PrerenderTestURL("/password/autosignin.html", | 3289 PrerenderTestURL("/password/autosignin.html", |
3298 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); | 3290 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); |
3299 EXPECT_EQ(0, done_counter.count()); | 3291 EXPECT_EQ(0, done_counter.count()); |
3300 } | 3292 } |
3301 | 3293 |
3302 // Checks that the requests from a prerender are IDLE priority before the swap | |
3303 // (except on Android), but normal priority after the swap. | |
3304 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriority) { | |
3305 GURL before_swap_url = embedded_test_server()->GetURL(kPrefetchJpeg); | |
3306 GURL after_swap_url = embedded_test_server()->GetURL("/prerender/image.png"); | |
3307 GURL main_page_url = | |
3308 GetURLWithReplacement("/prerender/prerender_with_image.html", | |
3309 "REPLACE_WITH_IMAGE_URL", kPrefetchJpeg); | |
3310 | |
3311 // Setup request interceptors for subresources. | |
3312 auto get_priority_lambda = [](net::RequestPriority* out_priority, | |
3313 net::URLRequest* request) { | |
3314 *out_priority = request->priority(); | |
3315 }; | |
3316 RequestCounter before_swap_counter; | |
3317 net::RequestPriority before_swap_priority = net::THROTTLED; | |
3318 InterceptRequestAndCount( | |
3319 before_swap_url, &before_swap_counter, | |
3320 base::Bind(get_priority_lambda, base::Unretained(&before_swap_priority))); | |
3321 RequestCounter after_swap_counter; | |
3322 net::RequestPriority after_swap_priority = net::THROTTLED; | |
3323 InterceptRequestAndCount( | |
3324 after_swap_url, &after_swap_counter, | |
3325 base::Bind(get_priority_lambda, base::Unretained(&after_swap_priority))); | |
3326 | |
3327 // Start the prerender. | |
3328 PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 1); | |
3329 | |
3330 // Check priority before swap. | |
3331 before_swap_counter.WaitForCount(1); | |
3332 #if defined(OS_ANDROID) | |
3333 EXPECT_GT(before_swap_priority, net::IDLE); | |
3334 #else | |
3335 EXPECT_EQ(net::IDLE, before_swap_priority); | |
3336 #endif | |
3337 | |
3338 // Swap. | |
3339 NavigateToDestURL(); | |
3340 | |
3341 // Check priority after swap. | |
3342 GetActiveWebContents()->GetMainFrame()->ExecuteJavaScriptForTests( | |
3343 base::ASCIIToUTF16( | |
3344 "var img=new Image(); img.src='/prerender/image.png'")); | |
3345 after_swap_counter.WaitForCount(1); | |
3346 EXPECT_NE(net::IDLE, after_swap_priority); | |
3347 } | |
3348 | |
3349 // Checks that a request started before the swap gets its original priority back | |
3350 // after the swap. | |
3351 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourcePriorityOverlappingSwap) { | |
3352 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg); | |
3353 GURL main_page_url = | |
3354 GetURLWithReplacement("/prerender/prerender_with_image.html", | |
3355 "REPLACE_WITH_IMAGE_URL", kPrefetchJpeg); | |
3356 | |
3357 // Setup request interceptors for subresources. | |
3358 net::URLRequest* url_request = nullptr; | |
3359 net::RequestPriority priority = net::THROTTLED; | |
3360 base::RunLoop wait_loop; | |
3361 auto io_lambda = [](net::URLRequest** out_request, | |
3362 net::RequestPriority* out_priority, base::Closure closure, | |
3363 net::URLRequest* request) { | |
3364 if (out_request) | |
3365 *out_request = request; | |
3366 content::BrowserThread::PostTask( | |
3367 content::BrowserThread::UI, FROM_HERE, | |
3368 base::Bind( | |
3369 [](net::RequestPriority priority, | |
3370 net::RequestPriority* out_priority, base::Closure closure) { | |
3371 *out_priority = priority; | |
3372 closure.Run(); | |
3373 }, | |
3374 request->priority(), base::Unretained(out_priority), closure)); | |
3375 }; | |
3376 | |
3377 CreateHangingFirstRequestInterceptor( | |
3378 image_url, base::FilePath(), | |
3379 base::Bind(io_lambda, base::Unretained(&url_request), | |
3380 base::Unretained(&priority), wait_loop.QuitClosure())); | |
3381 | |
3382 // The prerender will hang on the image resource, can't run the usual checks. | |
3383 DisableLoadEventCheck(); | |
3384 DisableJavascriptCalls(); | |
3385 // Start the prerender. | |
3386 PrerenderTestURL(main_page_url, FINAL_STATUS_USED, 0); | |
3387 | |
3388 // Check priority before swap. | |
3389 #if defined(OS_ANDROID) | |
3390 if (priority <= net::IDLE) | |
3391 wait_loop.Run(); | |
3392 EXPECT_GT(priority, net::IDLE); | |
3393 #else | |
3394 if (priority != net::IDLE) | |
3395 wait_loop.Run(); | |
3396 EXPECT_EQ(net::IDLE, priority); | |
3397 #endif | |
3398 | |
3399 // Swap. Cannot use NavigateToDestURL, because it waits for the load to | |
3400 // complete, but the resource is still hung. | |
3401 current_browser()->OpenURL(content::OpenURLParams( | |
3402 dest_url(), Referrer(), WindowOpenDisposition::CURRENT_TAB, | |
3403 ui::PAGE_TRANSITION_TYPED, false)); | |
3404 | |
3405 // Check priority after swap. The test may timeout in case of failure. | |
3406 priority = net::THROTTLED; | |
3407 do { | |
3408 base::RunLoop loop; | |
3409 content::BrowserThread::PostTask( | |
3410 content::BrowserThread::IO, FROM_HERE, | |
3411 base::Bind(io_lambda, nullptr, base::Unretained(&priority), | |
3412 loop.QuitClosure(), base::Unretained(url_request))); | |
3413 loop.Run(); | |
3414 } while (priority <= net::IDLE); | |
3415 EXPECT_GT(priority, net::IDLE); | |
3416 } | |
3417 | |
3418 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { | 3294 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { |
3419 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3295 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3420 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3296 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3421 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 3297 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
3422 | 3298 |
3423 base::TimeTicks load_start = clock->NowTicks(); | 3299 base::TimeTicks load_start = clock->NowTicks(); |
3424 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3300 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3425 NavigateToDestURL(); | 3301 NavigateToDestURL(); |
3426 | 3302 |
3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3303 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 12 matching lines...) Expand all Loading... |
3440 histogram_tester().ExpectUniqueSample( | 3316 histogram_tester().ExpectUniqueSample( |
3441 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); | 3317 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); |
3442 } | 3318 } |
3443 | 3319 |
3444 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { | 3320 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { |
3445 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3321 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3446 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3322 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3447 | 3323 |
3448 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3324 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3449 base::RunLoop hanging_request_waiter; | 3325 base::RunLoop hanging_request_waiter; |
3450 CreateHangingFirstRequestInterceptor( | 3326 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
3451 url, GetTestPath("prerender_page.html"), | 3327 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, |
3452 GetIOCallbackFromUIClosure(hanging_request_waiter.QuitClosure())); | 3328 url, GetTestPath("prerender_page.html"), |
| 3329 hanging_request_waiter.QuitClosure())); |
3453 // As this load will be canceled, it is not waited for, and hence no | 3330 // As this load will be canceled, it is not waited for, and hence no |
3454 // javascript is executed. | 3331 // javascript is executed. |
3455 DisableJavascriptCalls(); | 3332 DisableJavascriptCalls(); |
3456 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); | 3333 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); |
3457 hanging_request_waiter.Run(); | 3334 hanging_request_waiter.Run(); |
3458 | 3335 |
3459 // This prerender cancels and reuses the first. | 3336 // This prerender cancels and reuses the first. |
3460 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3337 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3461 base::TimeTicks load_start = clock->NowTicks(); | 3338 base::TimeTicks load_start = clock->NowTicks(); |
3462 EnableJavascriptCalls(); | 3339 EnableJavascriptCalls(); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3527 FirstContentfulPaintTimingNoCommit) { | 3404 FirstContentfulPaintTimingNoCommit) { |
3528 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3405 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3529 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3406 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3530 | 3407 |
3531 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3408 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3532 base::FilePath url_file = ui_test_utils::GetTestFilePath( | 3409 base::FilePath url_file = ui_test_utils::GetTestFilePath( |
3533 base::FilePath(), | 3410 base::FilePath(), |
3534 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); | 3411 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
3535 | 3412 |
3536 base::RunLoop prerender_start_loop; | 3413 base::RunLoop prerender_start_loop; |
3537 CreateHangingFirstRequestInterceptor( | 3414 BrowserThread::PostTask( |
3538 url, url_file, | 3415 BrowserThread::IO, FROM_HERE, |
3539 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); | 3416 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, |
| 3417 prerender_start_loop.QuitClosure())); |
3540 // As this load is uncommitted, it is not waited for, and hence no | 3418 // As this load is uncommitted, it is not waited for, and hence no |
3541 // javascript is executed. | 3419 // javascript is executed. |
3542 DisableJavascriptCalls(); | 3420 DisableJavascriptCalls(); |
3543 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); | 3421 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
3544 prerender_start_loop.Run(); | 3422 prerender_start_loop.Run(); |
3545 | 3423 |
3546 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3424 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3547 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 3425 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
3548 | 3426 |
3549 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3646 FirstContentfulPaintHiddenNoCommit) { | 3524 FirstContentfulPaintHiddenNoCommit) { |
3647 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3525 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3648 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3526 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3649 | 3527 |
3650 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3528 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3651 base::FilePath url_file = ui_test_utils::GetTestFilePath( | 3529 base::FilePath url_file = ui_test_utils::GetTestFilePath( |
3652 base::FilePath(), | 3530 base::FilePath(), |
3653 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); | 3531 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
3654 | 3532 |
3655 base::RunLoop prerender_start_loop; | 3533 base::RunLoop prerender_start_loop; |
3656 CreateHangingFirstRequestInterceptor( | 3534 BrowserThread::PostTask( |
3657 url, url_file, | 3535 BrowserThread::IO, FROM_HERE, |
3658 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); | 3536 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, |
| 3537 prerender_start_loop.QuitClosure())); |
3659 // As this load is uncommitted, it is not waited for, and hence no | 3538 // As this load is uncommitted, it is not waited for, and hence no |
3660 // javascript is executed. | 3539 // javascript is executed. |
3661 DisableJavascriptCalls(); | 3540 DisableJavascriptCalls(); |
3662 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); | 3541 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
3663 prerender_start_loop.Run(); | 3542 prerender_start_loop.Run(); |
3664 | 3543 |
3665 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3544 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3666 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 3545 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
3667 | 3546 |
3668 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3547 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3908 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, | 3787 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, |
3909 "DidDisplayReallyPass()", | 3788 "DidDisplayReallyPass()", |
3910 &display_test_result)); | 3789 &display_test_result)); |
3911 ASSERT_TRUE(display_test_result); | 3790 ASSERT_TRUE(display_test_result); |
3912 } | 3791 } |
3913 #endif // !defined(DISABLE_NACL) | 3792 #endif // !defined(DISABLE_NACL) |
3914 | 3793 |
3915 } // namespace prerender | 3794 } // namespace prerender |
3916 | 3795 |
3917 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) | 3796 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) |
OLD | NEW |