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::CreateHangingFirstRequestInterceptorOnIO; | 146 using prerender::test_utils::CreateHangingFirstRequestInterceptor; |
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 |
169 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { | 171 class FaviconUpdateWatcher : public favicon::FaviconDriverObserver { |
170 public: | 172 public: |
171 explicit FaviconUpdateWatcher(content::WebContents* web_contents) | 173 explicit FaviconUpdateWatcher(content::WebContents* web_contents) |
172 : seen_(false), running_(false), scoped_observer_(this) { | 174 : seen_(false), running_(false), scoped_observer_(this) { |
173 scoped_observer_.Add( | 175 scoped_observer_.Add( |
174 favicon::ContentFaviconDriver::FromWebContents(web_contents)); | 176 favicon::ContentFaviconDriver::FromWebContents(web_contents)); |
175 } | 177 } |
176 | 178 |
177 void Wait() { | 179 void Wait() { |
178 if (seen_) | 180 if (seen_) |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 base::FilePath(FILE_PATH_LITERAL("prerender")), | 534 base::FilePath(FILE_PATH_LITERAL("prerender")), |
533 base::FilePath().AppendASCII(file_name)); | 535 base::FilePath().AppendASCII(file_name)); |
534 } | 536 } |
535 | 537 |
536 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( | 538 page_load_metrics::PageLoadExtraInfo GenericPageLoadExtraInfo( |
537 const GURL& dest_url) { | 539 const GURL& dest_url) { |
538 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( | 540 return page_load_metrics::PageLoadExtraInfo::CreateForTesting( |
539 dest_url, false /* started_in_foreground */); | 541 dest_url, false /* started_in_foreground */); |
540 } | 542 } |
541 | 543 |
| 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 |
542 } // namespace | 555 } // namespace |
543 | 556 |
544 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { | 557 class PrerenderBrowserTest : public test_utils::PrerenderInProcessBrowserTest { |
545 public: | 558 public: |
546 PrerenderBrowserTest() | 559 PrerenderBrowserTest() |
547 : call_javascript_(true), | 560 : call_javascript_(true), |
548 check_load_events_(true), | 561 check_load_events_(true), |
549 loader_path_("/prerender/prerender_loader.html") {} | 562 loader_path_("/prerender/prerender_loader.html") {} |
550 | 563 |
551 ~PrerenderBrowserTest() override {} | 564 ~PrerenderBrowserTest() override {} |
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap | 1308 #define MAYBE_PrerenderNoCommitNoSwap PrerenderNoCommitNoSwap |
1296 #endif | 1309 #endif |
1297 // Checks that the prerendering of a page is canceled correctly if we try to | 1310 // Checks that the prerendering of a page is canceled correctly if we try to |
1298 // swap it in before it commits. | 1311 // swap it in before it commits. |
1299 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { | 1312 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap) { |
1300 // Navigate to a page that triggers a prerender for a URL that never commits. | 1313 // Navigate to a page that triggers a prerender for a URL that never commits. |
1301 const GURL kNoCommitUrl("http://never-respond.example.com"); | 1314 const GURL kNoCommitUrl("http://never-respond.example.com"); |
1302 base::FilePath file(GetTestPath("prerender_page.html")); | 1315 base::FilePath file(GetTestPath("prerender_page.html")); |
1303 | 1316 |
1304 base::RunLoop prerender_start_loop; | 1317 base::RunLoop prerender_start_loop; |
1305 BrowserThread::PostTask( | 1318 CreateHangingFirstRequestInterceptor( |
1306 BrowserThread::IO, FROM_HERE, | 1319 kNoCommitUrl, file, |
1307 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, | 1320 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); |
1308 prerender_start_loop.QuitClosure())); | |
1309 DisableJavascriptCalls(); | 1321 DisableJavascriptCalls(); |
1310 PrerenderTestURL(kNoCommitUrl, | 1322 PrerenderTestURL(kNoCommitUrl, |
1311 FINAL_STATUS_NAVIGATION_UNCOMMITTED, | 1323 FINAL_STATUS_NAVIGATION_UNCOMMITTED, |
1312 0); | 1324 0); |
1313 // Wait for the hanging request to be scheduled. | 1325 // Wait for the hanging request to be scheduled. |
1314 prerender_start_loop.Run(); | 1326 prerender_start_loop.Run(); |
1315 | 1327 |
1316 // Navigate to the URL, but assume the contents won't be swapped in. | 1328 // Navigate to the URL, but assume the contents won't be swapped in. |
1317 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 1329 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
1318 } | 1330 } |
1319 | 1331 |
1320 // crbug.com/708158 | 1332 // crbug.com/708158 |
1321 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) | 1333 #if defined(OS_MACOSX) && defined(ADDRESS_SANITIZER) |
1322 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 | 1334 #define MAYBE_PrerenderNoCommitNoSwap2 DISABLED_PrerenderNoCommitNoSwap2 |
1323 #else | 1335 #else |
1324 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 | 1336 #define MAYBE_PrerenderNoCommitNoSwap2 PrerenderNoCommitNoSwap2 |
1325 #endif | 1337 #endif |
1326 // Checks that client redirects don't add alias URLs until after they commit. | 1338 // Checks that client redirects don't add alias URLs until after they commit. |
1327 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { | 1339 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MAYBE_PrerenderNoCommitNoSwap2) { |
1328 // Navigate to a page that then navigates to a URL that never commits. | 1340 // Navigate to a page that then navigates to a URL that never commits. |
1329 const GURL kNoCommitUrl("http://never-respond.example.com"); | 1341 const GURL kNoCommitUrl("http://never-respond.example.com"); |
1330 base::FilePath file(GetTestPath("prerender_page.html")); | 1342 base::FilePath file(GetTestPath("prerender_page.html")); |
1331 | 1343 |
1332 base::RunLoop prerender_start_loop; | 1344 base::RunLoop prerender_start_loop; |
1333 BrowserThread::PostTask( | 1345 CreateHangingFirstRequestInterceptor( |
1334 BrowserThread::IO, FROM_HERE, | 1346 kNoCommitUrl, file, |
1335 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, kNoCommitUrl, file, | 1347 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); |
1336 prerender_start_loop.QuitClosure())); | |
1337 DisableJavascriptCalls(); | 1348 DisableJavascriptCalls(); |
1338 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), | 1349 PrerenderTestURL(CreateClientRedirect(kNoCommitUrl.spec()), |
1339 FINAL_STATUS_APP_TERMINATING, 1); | 1350 FINAL_STATUS_APP_TERMINATING, 1); |
1340 // Wait for the hanging request to be scheduled. | 1351 // Wait for the hanging request to be scheduled. |
1341 prerender_start_loop.Run(); | 1352 prerender_start_loop.Run(); |
1342 | 1353 |
1343 // Navigating to the second URL should not swap. | 1354 // Navigating to the second URL should not swap. |
1344 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, | 1355 NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB, |
1345 false); | 1356 false); |
1346 } | 1357 } |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 // Checks that prerendering a PNG works correctly. | 2113 // Checks that prerendering a PNG works correctly. |
2103 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { | 2114 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImagePng) { |
2104 DisableJavascriptCalls(); | 2115 DisableJavascriptCalls(); |
2105 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); | 2116 PrerenderTestURL("/prerender/image.png", FINAL_STATUS_USED, 1); |
2106 NavigateToDestURL(); | 2117 NavigateToDestURL(); |
2107 } | 2118 } |
2108 | 2119 |
2109 // Checks that prerendering a JPG works correctly. | 2120 // Checks that prerendering a JPG works correctly. |
2110 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { | 2121 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderImageJpeg) { |
2111 DisableJavascriptCalls(); | 2122 DisableJavascriptCalls(); |
2112 PrerenderTestURL("/prerender/image.jpeg", FINAL_STATUS_USED, 1); | 2123 PrerenderTestURL(kPrefetchJpeg, FINAL_STATUS_USED, 1); |
2113 NavigateToDestURL(); | 2124 NavigateToDestURL(); |
2114 } | 2125 } |
2115 | 2126 |
2116 // Checks that a prerender of a CRX will result in a cancellation due to | 2127 // Checks that a prerender of a CRX will result in a cancellation due to |
2117 // download. | 2128 // download. |
2118 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { | 2129 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderCrx) { |
2119 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); | 2130 PrerenderTestURL("/prerender/extension.crx", FINAL_STATUS_DOWNLOAD, 0); |
2120 } | 2131 } |
2121 | 2132 |
2122 // Checks that xhr GET requests allow prerenders. | 2133 // Checks that xhr GET requests allow prerenders. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2174 } | 2185 } |
2175 | 2186 |
2176 // Checks that an SSL error that comes from a subresource does not cancel | 2187 // Checks that an SSL error that comes from a subresource does not cancel |
2177 // the page. Non-main-frame requests are simply cancelled if they run into | 2188 // the page. Non-main-frame requests are simply cancelled if they run into |
2178 // an SSL problem. | 2189 // an SSL problem. |
2179 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { | 2190 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorSubresource) { |
2180 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 2191 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
2181 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); | 2192 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
2182 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 2193 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
2183 ASSERT_TRUE(https_server.Start()); | 2194 ASSERT_TRUE(https_server.Start()); |
2184 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); | 2195 GURL https_url = https_server.GetURL(kPrefetchJpeg); |
2185 base::StringPairs replacement_text; | 2196 base::StringPairs replacement_text; |
2186 replacement_text.push_back( | 2197 replacement_text.push_back( |
2187 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); | 2198 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
2188 std::string replacement_path; | 2199 std::string replacement_path; |
2189 net::test_server::GetFilePathWithReplacements( | 2200 net::test_server::GetFilePathWithReplacements( |
2190 "/prerender/prerender_with_image.html", replacement_text, | 2201 "/prerender/prerender_with_image.html", replacement_text, |
2191 &replacement_path); | 2202 &replacement_path); |
2192 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); | 2203 PrerenderTestURL(replacement_path, FINAL_STATUS_USED, 1); |
2193 NavigateToDestURL(); | 2204 NavigateToDestURL(); |
2194 } | 2205 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2286 ->set_client_cert_store_factory_for_testing(base::Bind( | 2297 ->set_client_cert_store_factory_for_testing(base::Bind( |
2287 &CreateCertStore, net::ImportCertFromFile( | 2298 &CreateCertStore, net::ImportCertFromFile( |
2288 net::GetTestCertsDirectory(), "ok_cert.pem"))); | 2299 net::GetTestCertsDirectory(), "ok_cert.pem"))); |
2289 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); | 2300 net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); |
2290 net::SSLServerConfig ssl_config; | 2301 net::SSLServerConfig ssl_config; |
2291 ssl_config.client_cert_type = | 2302 ssl_config.client_cert_type = |
2292 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; | 2303 net::SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT; |
2293 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); | 2304 https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config); |
2294 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); | 2305 https_server.ServeFilesFromSourceDirectory("chrome/test/data"); |
2295 ASSERT_TRUE(https_server.Start()); | 2306 ASSERT_TRUE(https_server.Start()); |
2296 GURL https_url = https_server.GetURL("/prerender/image.jpeg"); | 2307 GURL https_url = https_server.GetURL(kPrefetchJpeg); |
2297 base::StringPairs replacement_text; | 2308 base::StringPairs replacement_text; |
2298 replacement_text.push_back( | 2309 replacement_text.push_back( |
2299 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); | 2310 std::make_pair("REPLACE_WITH_IMAGE_URL", https_url.spec())); |
2300 std::string replacement_path; | 2311 std::string replacement_path; |
2301 net::test_server::GetFilePathWithReplacements( | 2312 net::test_server::GetFilePathWithReplacements( |
2302 "/prerender/prerender_with_image.html", replacement_text, | 2313 "/prerender/prerender_with_image.html", replacement_text, |
2303 &replacement_path); | 2314 &replacement_path); |
2304 PrerenderTestURL(replacement_path, | 2315 PrerenderTestURL(replacement_path, |
2305 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, | 2316 FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, |
2306 0); | 2317 0); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 PrerenderSafeBrowsingClientRedirect) { | 2371 PrerenderSafeBrowsingClientRedirect) { |
2361 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 2372 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
2362 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( | 2373 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
2363 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 2374 url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
2364 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), | 2375 PrerenderTestURL(CreateClientRedirect("/prerender/prerender_page.html"), |
2365 FINAL_STATUS_SAFE_BROWSING, 1); | 2376 FINAL_STATUS_SAFE_BROWSING, 1); |
2366 } | 2377 } |
2367 | 2378 |
2368 // Ensures that we do not prerender pages which have a malware subresource. | 2379 // Ensures that we do not prerender pages which have a malware subresource. |
2369 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { | 2380 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSafeBrowsingSubresource) { |
2370 GURL image_url = embedded_test_server()->GetURL("/prerender/image.jpeg"); | 2381 GURL image_url = embedded_test_server()->GetURL(kPrefetchJpeg); |
2371 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( | 2382 GetFakeSafeBrowsingDatabaseManager()->SetThreatTypeForUrl( |
2372 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); | 2383 image_url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE); |
2373 base::StringPairs replacement_text; | 2384 base::StringPairs replacement_text; |
2374 replacement_text.push_back( | 2385 replacement_text.push_back( |
2375 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); | 2386 std::make_pair("REPLACE_WITH_IMAGE_URL", image_url.spec())); |
2376 std::string replacement_path; | 2387 std::string replacement_path; |
2377 net::test_server::GetFilePathWithReplacements( | 2388 net::test_server::GetFilePathWithReplacements( |
2378 "/prerender/prerender_with_image.html", replacement_text, | 2389 "/prerender/prerender_with_image.html", replacement_text, |
2379 &replacement_path); | 2390 &replacement_path); |
2380 PrerenderTestURL(replacement_path, | 2391 PrerenderTestURL(replacement_path, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2484 destruction_observer.Wait(); | 2495 destruction_observer.Wait(); |
2485 } | 2496 } |
2486 | 2497 |
2487 // Checks that a hanging unload on the referring page of a prerender swap does | 2498 // Checks that a hanging unload on the referring page of a prerender swap does |
2488 // not crash the browser on exit. | 2499 // not crash the browser on exit. |
2489 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { | 2500 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { |
2490 // Matches URL in prerender_loader_with_unload.html. | 2501 // Matches URL in prerender_loader_with_unload.html. |
2491 const GURL hang_url("http://unload-url.test"); | 2502 const GURL hang_url("http://unload-url.test"); |
2492 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 2503 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
2493 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 2504 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
2494 BrowserThread::PostTask( | 2505 CreateHangingFirstRequestInterceptor( |
2495 BrowserThread::IO, FROM_HERE, | 2506 hang_url, empty_file, base::Callback<void(net::URLRequest*)>()); |
2496 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, | |
2497 hang_url, empty_file, | |
2498 base::Closure())); | |
2499 | 2507 |
2500 set_loader_path("/prerender/prerender_loader_with_unload.html"); | 2508 set_loader_path("/prerender/prerender_loader_with_unload.html"); |
2501 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 2509 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
2502 NavigateToDestURL(); | 2510 NavigateToDestURL(); |
2503 } | 2511 } |
2504 | 2512 |
2505 | 2513 |
2506 // Checks that when the history is cleared, prerendering is cancelled and | 2514 // Checks that when the history is cleared, prerendering is cancelled and |
2507 // prerendering history is cleared. | 2515 // prerendering history is cleared. |
2508 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { | 2516 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClearHistory) { |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3284 done_url, empty_file, done_counter.AsWeakPtr())); | 3292 done_url, empty_file, done_counter.AsWeakPtr())); |
3285 // Loading may finish or be interrupted. The final result is important only. | 3293 // Loading may finish or be interrupted. The final result is important only. |
3286 DisableLoadEventCheck(); | 3294 DisableLoadEventCheck(); |
3287 // TestPrenderContents is always created before the Autosignin JS can run, so | 3295 // TestPrenderContents is always created before the Autosignin JS can run, so |
3288 // waiting for PrerenderContents to stop should be reliable. | 3296 // waiting for PrerenderContents to stop should be reliable. |
3289 PrerenderTestURL("/password/autosignin.html", | 3297 PrerenderTestURL("/password/autosignin.html", |
3290 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); | 3298 FINAL_STATUS_CREDENTIAL_MANAGER_API, 0); |
3291 EXPECT_EQ(0, done_counter.count()); | 3299 EXPECT_EQ(0, done_counter.count()); |
3292 } | 3300 } |
3293 | 3301 |
| 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 |
3294 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { | 3418 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingSimple) { |
3295 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3419 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3296 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3420 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3297 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 3421 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
3298 | 3422 |
3299 base::TimeTicks load_start = clock->NowTicks(); | 3423 base::TimeTicks load_start = clock->NowTicks(); |
3300 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3424 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3301 NavigateToDestURL(); | 3425 NavigateToDestURL(); |
3302 | 3426 |
3303 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3427 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 13 matching lines...) Expand all Loading... |
3317 histogram_tester().ExpectUniqueSample( | 3441 histogram_tester().ExpectUniqueSample( |
3318 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); | 3442 "Prerender.websame_PrefetchTTFCP.Warm.Cacheable.Visible", 1654, 1); |
3319 } | 3443 } |
3320 | 3444 |
3321 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { | 3445 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, FirstContentfulPaintTimingReuse) { |
3322 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3446 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3323 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3447 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3324 | 3448 |
3325 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3449 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3326 base::RunLoop hanging_request_waiter; | 3450 base::RunLoop hanging_request_waiter; |
3327 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 3451 CreateHangingFirstRequestInterceptor( |
3328 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, | 3452 url, GetTestPath("prerender_page.html"), |
3329 url, GetTestPath("prerender_page.html"), | 3453 GetIOCallbackFromUIClosure(hanging_request_waiter.QuitClosure())); |
3330 hanging_request_waiter.QuitClosure())); | |
3331 // As this load will be canceled, it is not waited for, and hence no | 3454 // As this load will be canceled, it is not waited for, and hence no |
3332 // javascript is executed. | 3455 // javascript is executed. |
3333 DisableJavascriptCalls(); | 3456 DisableJavascriptCalls(); |
3334 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); | 3457 PrerenderTestURL(url, FINAL_STATUS_CANCELLED, 0); |
3335 hanging_request_waiter.Run(); | 3458 hanging_request_waiter.Run(); |
3336 | 3459 |
3337 // This prerender cancels and reuses the first. | 3460 // This prerender cancels and reuses the first. |
3338 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3461 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3339 base::TimeTicks load_start = clock->NowTicks(); | 3462 base::TimeTicks load_start = clock->NowTicks(); |
3340 EnableJavascriptCalls(); | 3463 EnableJavascriptCalls(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3407 FirstContentfulPaintTimingNoCommit) { | 3530 FirstContentfulPaintTimingNoCommit) { |
3408 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3531 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3409 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3532 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3410 | 3533 |
3411 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3534 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3412 base::FilePath url_file = ui_test_utils::GetTestFilePath( | 3535 base::FilePath url_file = ui_test_utils::GetTestFilePath( |
3413 base::FilePath(), | 3536 base::FilePath(), |
3414 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); | 3537 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
3415 | 3538 |
3416 base::RunLoop prerender_start_loop; | 3539 base::RunLoop prerender_start_loop; |
3417 BrowserThread::PostTask( | 3540 CreateHangingFirstRequestInterceptor( |
3418 BrowserThread::IO, FROM_HERE, | 3541 url, url_file, |
3419 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, | 3542 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); |
3420 prerender_start_loop.QuitClosure())); | |
3421 // As this load is uncommitted, it is not waited for, and hence no | 3543 // As this load is uncommitted, it is not waited for, and hence no |
3422 // javascript is executed. | 3544 // javascript is executed. |
3423 DisableJavascriptCalls(); | 3545 DisableJavascriptCalls(); |
3424 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); | 3546 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
3425 prerender_start_loop.Run(); | 3547 prerender_start_loop.Run(); |
3426 | 3548 |
3427 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3549 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3428 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 3550 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
3429 | 3551 |
3430 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3552 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3530 FirstContentfulPaintHiddenNoCommit) { | 3652 FirstContentfulPaintHiddenNoCommit) { |
3531 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); | 3653 GetPrerenderManager()->DisablePageLoadMetricsObserverForTesting(); |
3532 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); | 3654 base::SimpleTestTickClock* clock = OverridePrerenderManagerTimeTicks(); |
3533 | 3655 |
3534 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); | 3656 GURL url = embedded_test_server()->GetURL("/prerender/prerender_page.html"); |
3535 base::FilePath url_file = ui_test_utils::GetTestFilePath( | 3657 base::FilePath url_file = ui_test_utils::GetTestFilePath( |
3536 base::FilePath(), | 3658 base::FilePath(), |
3537 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); | 3659 base::FilePath(FILE_PATH_LITERAL("prerender/prerender_page.html"))); |
3538 | 3660 |
3539 base::RunLoop prerender_start_loop; | 3661 base::RunLoop prerender_start_loop; |
3540 BrowserThread::PostTask( | 3662 CreateHangingFirstRequestInterceptor( |
3541 BrowserThread::IO, FROM_HERE, | 3663 url, url_file, |
3542 base::Bind(&CreateHangingFirstRequestInterceptorOnIO, url, url_file, | 3664 GetIOCallbackFromUIClosure(prerender_start_loop.QuitClosure())); |
3543 prerender_start_loop.QuitClosure())); | |
3544 // As this load is uncommitted, it is not waited for, and hence no | 3665 // As this load is uncommitted, it is not waited for, and hence no |
3545 // javascript is executed. | 3666 // javascript is executed. |
3546 DisableJavascriptCalls(); | 3667 DisableJavascriptCalls(); |
3547 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); | 3668 PrerenderTestURL(url, FINAL_STATUS_NAVIGATION_UNCOMMITTED, 0); |
3548 prerender_start_loop.Run(); | 3669 prerender_start_loop.Run(); |
3549 | 3670 |
3550 clock->Advance(base::TimeDelta::FromSeconds(1)); | 3671 clock->Advance(base::TimeDelta::FromSeconds(1)); |
3551 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); | 3672 NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false); |
3552 | 3673 |
3553 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), | 3674 PrerenderPageLoadMetricsObserver observer(GetPrerenderManager(), |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3794 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, | 3915 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(web_contents, |
3795 "DidDisplayReallyPass()", | 3916 "DidDisplayReallyPass()", |
3796 &display_test_result)); | 3917 &display_test_result)); |
3797 ASSERT_TRUE(display_test_result); | 3918 ASSERT_TRUE(display_test_result); |
3798 } | 3919 } |
3799 #endif // !defined(DISABLE_NACL) | 3920 #endif // !defined(DISABLE_NACL) |
3800 | 3921 |
3801 } // namespace prerender | 3922 } // namespace prerender |
3802 | 3923 |
3803 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) | 3924 #endif // !defined(OS_MACOSX) || !defined(ADDRESS_SANITIZER) |
OLD | NEW |